htaccess 自动更改 RewriteRule

htaccess changing automaticly the RewriteRule

我正在尝试修复将这些 HTTPS 和非 www 规则添加到 .htaccess 顶部文件后出现的错误

RewriteEngine on
RewriteCond %{HTTPS} off
RewriteRule (.*) https://%{HTTP_HOST}%{REQUEST_URI} [L,NE,R=301,QSA]
RewriteCond %{HTTP_HOST} !^www\. [NC]
RewriteRule (.*) https://www.%{HTTP_HOST}%{REQUEST_URI} [L,NE,R=301,QSA]

它确实修复了 HTTPS 和非 www,但它弄乱了这条规则

RewriteRule ^product/([0-9]+)$ product.php?p= [NC,L,QSA]

现在只要没有 HTTPS 或没有 www

,它就会更改此 URL

我希望它再次回到这里:

听起来你把指令放在了错误的顺序。在内部重写之前,您的规范重定向(HTTP 到 HTTPS 和非 www 到 www)需要位于 .htaccess 文件的顶部。

此外,由于您正在内部重写一个与请求的 URL 路径具有相同基本名称的文件,因此您需要确保禁用 MultiViews 以防止 mod_negotiation 在内部发出一个在 mod_rewrite 能够处理请求之前对 /product.php/2443 的子请求。例如,在 .htaccess 文件的顶部添加以下内容以确保禁用 MultiViews:

Options -MultiViews

您需要清除浏览器缓存,因为这些错误的(301 - 永久性)重定向将被浏览器缓存。

旁白:

RewriteCond %{HTTPS} off
RewriteRule (.*) https://%{HTTP_HOST}%{REQUEST_URI} [L,NE,R=301,QSA]
RewriteCond %{HTTP_HOST} !^www\. [NC]
RewriteRule (.*) https://www.%{HTTP_HOST}%{REQUEST_URI} [L,NE,R=301,QSA]

颠倒这两个规则以避免请求 HTTP + 非 www 时的双重重定向。但是,如果您计划实施 HSTS,则应保持原样。

这些规则中的任何一个都不需要 QSA 标志。

并且捕获 RewriteRule 模式 (即 (.*))是多余的。仅使用 ^ (或 $) - 一个断言 - 因为它只需要对所有事情都成功,它不需要实际匹配任何东西会更有效。