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

Apache 使用HTTPS/www重写URL不适用于子页面,apache,.htaccess,redirect,mod-rewrite,typo3,Apache,.htaccess,Redirect,Mod Rewrite,Typo3,我必须在.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 ^

我必须在.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被正确地重定向了。联系人页面的示例,如上所示


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

我认为您的
重写规则是错误的。它应该是
*
而不是
^

# 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]

我认为你的
重写规则是错误的。它应该是
*
而不是
^

# 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在此停止处理。因此,我将这两条规则移到了这个块的上方,并在这个块开始工作之前调用它们。

问题是.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在此停止处理。所以我把我的两条规则都移到了这个区块上面,在这个区块开始运行之前,它们会被调用。

欢迎来到So,感谢您的详细帖子(请继续关注)。如果您在日志等中看到任何错误,请告诉我们(因为从外观上看,您的规则在我看来很好)?您需要自己调试:在浏览器中打开开发控制台。此测试使用全新的匿名浏览器以防止缓存问题。发出请求并监视浏览器实际收到的重定向。这样你可以缩小问题的范围。很可能这只是一个缓存问题。一般情况下:当您仍在尝试时,请始终使用302重定向。只有当你确信你的设置是最终的时,才将其更改为301。欢迎访问SO,感谢详细的帖子(请继续关注)。如果您在日志等中看到任何错误,请告诉我们(因为从外观上看,您的规则在我看来很好)?您需要自己调试:在浏览器中打开开发控制台。此测试使用全新的匿名浏览器以防止缓存问题。发出请求并监视浏览器实际收到的重定向。这样你可以缩小问题的范围。很可能这只是一个缓存问题。一般情况下:当您仍在尝试时,请始终使用302重定向。只有当您确信您的设置是最终设置时,才将其更改为301。
^
仅匹配字符串的开头,因此它应该始终匹配。问题是基本Typo3.htaccess文件中的另一条规则。这些类型3规则是由提供者自动设置的。查看我的答案。
^
只匹配字符串的开头,因此它应该始终匹配。问题是基本Typo3.htaccess文件中的另一条规则。这些类型3规则是由提供者自动设置的。看看我的答案。