【问题标题】:Apache RewriteRule [L] flag ignoredApache RewriteRule [L] 标志被忽略
【发布时间】:2019-12-06 03:56:30
【问题描述】:

我正在尝试配置 Apache 重写规则。我的网站目录包含三个文件

index.html
index2.html
index3.html

我正在使用这些 Apache 重写规则:

RewriteRule index.html /index2.html [R=301,L]
RewriteRule index2.html /index3.html [R=301,L]

根据 Apache 关于[L] option 的文档:

[L] 标志导致 mod_rewrite 停止处理规则集。在大多数情况下,这意味着如果规则匹配,则不会处理更多规则。

所以当我请求index.html 时,我希望index2.html 得到服务。然而,index.html 的请求最终以index3.html 结束。 [L] 选项不应该停止第二个RewriteRule 的处理吗?

我使用的 Apache 版本是 2.4.39 (Fedora)。类似的问题was asked here

【问题讨论】:

    标签: apache http web mod-rewrite server


    【解决方案1】:

    我意识到.htaccess 中的规则会针对每个请求进行处理。当我访问http://www.example.com/index.html 时会发生一些操作:

    1. .index.html 被请求
    2. 处理.htaccess 中的第一条规则。它匹配index.html 并重定向到index2.html[L] 停止处理后续规则
    3. 已请求index2.html
    4. 处理.htaccess 中的第一条规则。它无法匹配 index.html,因此不应用标志 [R=301,L]
    5. 处理.htaccess 中的第二条规则。它匹配index2.html 并重定向到index3.html[L] 停止处理后续规则

    我找到了两种可能的解决方案:

    • 将重写规则从/var/www/html/.htaccess 移动到/etc/httpd/sites-available/example.com.conf。与.htaccess 对每个请求进行处理不同,example.com.conf 只处理一次 -- 在服务器启动时。

    • 将规则保留在 .htaccess 中,但使用 [END] 标志而不是 [L]

    第一种方案的优点是规则只被处理一次。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2018-04-04
      • 1970-01-01
      • 2013-11-15
      • 2019-04-15
      • 2021-01-27
      • 2011-10-11
      • 1970-01-01
      相关资源
      最近更新 更多