问题描述
我必须在我的 .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 在这里停止处理。所以我将我的两个规则都移到了这个区块之上,并且在这个区块生效之前它们会被调用。