使用 HTTPS / www 重写 URL 不适用于子页面

问题描述

我必须在我的 .htaccess 中遵循配置。第一条规则将 https 放在 URL 之前,第二条规则将 www 放在 URL 之前(如果尚未设置)。

# https redirect
RewriteEngine On
RewriteCond %{HTTPS} !=on
RewriteRule ^ https://%{HTTP_HOST}%{REQUEST_URI} [L,R=301]
# www redirect
RewriteCond %{HTTP_HOST} !^www\. [NC]
RewriteRule ^ https://www.%{HTTP_HOST}%{REQUEST_URI} [L,R=301]

这些重定向非常适合主页。但是,如果您调用页面,这些规则将不起作用。

domain.xy -> https://www.domain.xy (works,Homepage)
domain.xy/contact -> http://domain.xy/contact (doesnt work)

奇怪的是,图标被正确重定向。联系页面示例,如上所示 this picture.

怎么可能,我的配置只适用于顶层,而不适用于任何子页面

解决方法

我想说您的 RewriteRule 是错误的。它应该是 .* 而不是 ^:

# https redirect
RewriteEngine On
RewriteCond %{HTTPS} !=on
RewriteRule .* https://%{HTTP_HOST}%{REQUEST_URI} [L,R=301]
# www redirect
RewriteCond %{HTTP_HOST} !^www\. [NC]
RewriteRule .* https://www.%{HTTP_HOST}%{REQUEST_URI} [L,R=301]
,

问题是 .htaccess-File 中的另一个规则。我们的托管服务提供商会自动生成适合 Typo3 安装的 .htaccess。我必须将重写规则放在以下几行之前:

# If the file/symlink/directory does not exist => Redirect to index.php.
# For httpd.conf,you need to prefix each '%{REQUEST_FILENAME}' with '%{DOCUMENT_ROOT}'.
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME} !-l
RewriteRule ^.*$ %{ENV:CWD}index.php [QSA,L]

据我所知,此规则会将任何请求(不是文件、目录或符号链接)重定向回 index.php。因此,在我的情况下,如果我调用 domain.xy/contact,它会重定向回 index.php

因为这条规则的末尾有 [L] 标志,.htaccess 在这里停止处理。所以我将我的两个规则都移到了这个区块之上,并且在这个区块生效之前它们会被调用。