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

URL rewrite with HTTPS / www not working for subpages

我必须在我的 .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)

奇怪的是,favicon 得到了正确的重定向。联系页面示例,如上所见 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 文件中的另一条规则。我们的托管服务提供商会自动生成适合 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 在这里停止处理。所以我将我的两个规则都移到了这个块之上,并且在这个块开始运行之前调用它们。