我的网站使用.htaccess重定向,如下所示:
RewriteEngine On
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^(.*)$ index.php/$1 [L]
RewriteCond %{HTTP_HOST} ^www.example.com [NC]
RewriteRule ^(.*)$ http://example.com/$1 [L,R=301]
问题是
警告,没有301重定向可以将流量重定向到您的首选域。成功加载www.和不加载www.的页面都被视为重复内容!并非所有版本的页面都指向同一个URL。
URL解析URL:
http://example.com/inner-page
重定向到https://example.com/inner-page
http://www.example.com/inner-page
重定向到https://example.com/index.php/inner-page
https://example.com/inner-page
重定向到https://example.com/inner-page
https://www.example.com/inner-page
重定向到https://example.com/index.php/inner-page
为什么同一个URL在浏览器中表现不同。我应该在.htaccess
文件中更改什么,以便它可以重定向到正确的URL?我想知道这种奇怪的行为是怎么发生的?
什么是解决方案,使他们都重定向到只有
https://example.com/inner-page
任何帮助都将不胜感激。
tl;dr你的规则顺序不对。您正在重定向到HTTP,而不是HTTPS。您并没有专门将HTTP重定向到HTTPS。
http://example.com/inner-page
重定向到https://example.com/inner-page
您发布的.htaccess
指令不执行此重定向。这可能是由您的PHP/应用程序触发的。
您在.htaccess
中的规则仅重定向www.example.com
,而不重定向example.com
。
http://www.example.com/inner-page
重定向到https://example.com/index.php/inner-page
因为您的规则顺序错误。第一条规则首先将请求重写为/index.php/inner-page
,然后重定向该URL。但这实际上是两个重定向,因为您发布的指令重定向到HTTP,而不是HTTPS。
您的第二条规则将触发重定向到http://example.com/index.php/inner-page
(注意HTTP(,您的PHP/应用程序可能正在将其重定向到HTTPS(见上文(。
https://example.com/inner-page
重定向到https://example.com/inner-page
这不是重定向。在这种情况下什么都没有发生。(这是正确的。(
https://www.example.com/inner-page
重定向到https://example.com/index.php/inner-page
与上面的#2相同。(除了你首先将请求重定向回HTTP,并且你依赖于PHP/应用程序重定向回HTTPS——见上文。(
您当前的规则并没有专门将HTTP重定向到HTTPS,它们只是将www重定向到非www。这个应该重定向到HTTPS,而不是HTTP。
请尝试以下操作:
RewriteEngine On
# Redirect www to non-www (+ HTTPS)
RewriteCond %{HTTP_HOST} ^www.(example.com) [NC]
RewriteRule (.*) https://%1/$1 [R=301,L]
# HTTP to HTTPS
RewriteCond %{HTTPS} off
RewriteRule (.*) https://%{HTTP_HOST}/$1 [R=301,L]
# Front-controller
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule (.*) index.php/$1 [L]
HTTP到HTTPS重定向假定SSL证书由您的应用服务器管理,即您没有使用CDN、负载均衡器、前端缓存代理等。(否则,这可能会触发重定向循环。(
首先测试302(临时(重定向,以避免潜在的缓存问题。
在测试之前,您需要清除浏览器缓存。