.htaccess 中的脏重定向

.htaccess 中的脏重定向

text/x-generic .htaccess(UTF-8 Unicode 文本)

RewriteEngine On
RewriteCond %{HTTPS} !=on
RewriteRule ^ https://%{HTTP_HOST}%{REQUEST_URI} [L,R=301]

# BEGIN WordPress
<IfModule mod_rewrite.c>
RewriteEngine On
RewriteBase /
RewriteRule ^index\.php$ - [L]
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule . /index.php [L]
</IfModule>

我的一个优化工具显示我对 www (HTTP) 进行了多次重定向,即从 HTTP 到 HTTPS,再从 HTTPS 到 HTTPS。我该如何修复此问题?

优化工具报告了 2 次重定向

答案1

...即从 HTTP 到 HTTPS,再从 HTTPS 到 HTTPS

具体来说,从您的屏幕截图中,您在请求 HTTP 和 www(即http://www.example.com)时看到两次重定向:

  1. http://www.example.comhttps://www.example.com(HTTP 至 HTTPS)
  2. https://www.example.comhttps://example.com(www 至非 www)

第 1 项是由您的.htaccess规则触发的,而第 2 项无疑是由 WordPress 本身在 PHP 中触发的。

如果你打算实现高速传输系统(无论您的“优化工具”报告了什么)。

否则,您可以通过规范化主机名来避免双重重定向.htaccessWordPress 就是这样做的。一种方法是添加附加规则您现有的 HTTP 到 HTTPS 重定向。例如:

RewriteEngine On

# www to non-www (and HTTPS)
RewriteCond %{HTTP_HOST} ^www\.([a-z.]+?)\.?$ [NC]
RewriteRule ^ https://%1%{REQUEST_URI} [L,R=301]   

# HTTP to HTTPS
RewriteCond %{HTTPS} !=on
RewriteRule ^ https://%{HTTP_HOST}%{REQUEST_URI} [L,R=301]

%1RewriteRule 代换是对最后一个匹配的第一个捕获组的反向引用条件模式换句话说,主机名减去任何www.前缀(对于 FQDN,则减去任何尾随的点)。

请注意,www 到非 www 的重定向也会重定向到 HTTPS。因此,这可确保在第一次重定向发生时永远不会处理后续的 HTTP 到 HTTPS(因此不会发生第二次重定向)。

确保在测试之前清除浏览器缓存。(为了避免缓存问题,通常最好先使用 302 - 临时 - 重定向进行测试。)

答案2

如果我理解你的问题你应该www删除{HTTP_HOST}

RewriteEngine On
RewriteCond %{HTTPS} !=on
RewriteRule ^ https://%{HTTP_HOST}%{REQUEST_URI} [L,R=301]

应改为

RewriteCond %{HTTP_HOST} ^www\.([a-z.]+)$ [NC]<br>
RewriteCond %{HTTPS} !=on
RewriteRule ^ https://%{HTTP_HOST}%{REQUEST_URI} [L,R=301]

希望它能帮助你。

相关内容