【问题标题】:htaccess changing automaticly the RewriteRulehtaccess 自动更改 RewriteRule
【发布时间】:2022-01-08 19:45:14
【问题描述】:

在将 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=$1 [NC,L,QSA]

现在只要没有 HTTPS 或没有 www,它就会更改此 URL

  • 来自:www.example.com/product/2443
  • 至:www.example.com/product.php/2443?p=2443

我希望它再次回到这个:

  • www.example.com/product/2443

【问题讨论】:

    标签: apache .htaccess mod-rewrite url-rewriting


    【解决方案1】:

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

    此外,由于您在内部重写到与请求的 URL 路径具有相同基本名称的文件,您需要确保禁用 MultiViews 以防止 mod_negotiation 在内部发出 /product.php/2443 的子请求之前 mod_rewrite 能够处理请求。例如,在 .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 pattern(即(.*))是多余的。只使用^(或$)会更有效——一个断言——因为它只需要对所有东西都成功,它不需要实际匹配任何东西。

    【讨论】:

    • 它不起作用,我清除了我的浏览器并且代码已经在顶部。我不知道它为什么要更改网址,无论如何,谢谢。
    • @DevWayAgence 还要确保禁用 MultiViews。我已经更新了我的答案。如果清除浏览器(和任何其他中介)缓存后仍然失败,请使用完整的.htaccess 文件更新您的问题。此外,可能需要检查浏览器中的 HTTP 响应(网络流量)。
    • 非常感谢您的帮助。在我添加 Options -MultiViews 后,URL 停止重定向
    猜你喜欢
    • 2018-06-16
    • 2019-02-09
    • 2015-01-14
    • 2013-09-19
    • 1970-01-01
    • 2012-11-10
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多