url未正确重定向到规范



我的网站使用.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:

  1. http://example.com/inner-page重定向到https://example.com/inner-page
  2. http://www.example.com/inner-page重定向到https://example.com/index.php/inner-page
  3. https://example.com/inner-page重定向到https://example.com/inner-page
  4. 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。


  1. http://example.com/inner-page重定向到https://example.com/inner-page

您发布的.htaccess指令不执行此重定向。这可能是由您的PHP/应用程序触发的。

您在.htaccess中的规则仅重定向www.example.com,而不重定向example.com

  1. 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(见上文(。

  1. https://example.com/inner-page重定向到https://example.com/inner-page

这不是重定向。在这种情况下什么都没有发生。(这是正确的。(

  1. 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(临时(重定向,以避免潜在的缓存问题。

在测试之前,您需要清除浏览器缓存。

最新更新