【问题标题】:mod_rewrite loops even with L flagmod_rewrite 即使带有 L 标志也会循环
【发布时间】:2011-01-08 18:52:56
【问题描述】:

我在将 URL 重写为 fastcgi 调度程序时遇到问题。如果我只离开:

RewriteRule ^(.*)$ dispatch.fcgi/$1 [L,QSA]

我预计L(最后一条规则)只会导致一次重写。相反,它一直在前面加上dispatch.fcgi,直到 apache 报告错误。

我知道它可以通过以下方式修复:

RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^(.*)$ dispatch.fcgi/$1 [L,QSA]

但是多次重写的原因是什么? L 做的事情和我想的不一样吗?

【问题讨论】:

    标签: apache mod-rewrite


    【解决方案1】:

    我知道这是一个老问题,但对于寻找真正答案的其他人来说,这里是:

    [L] 标志 确实.htaccess 文件中工作。它告诉rewrite module 跳过该特定.htaccess 文件中的所有以下规则。它完成了它的工作,Apache 重写了 url 并退出了 .htaccess 文件。

    但是,在.htaccess文件的末尾如果请求的url被改写了,整个url匹配过程会从新的url重新开始

    这就是上面发生的情况,^(.*)$始终匹配当前 url,它会导致无限循环,只有 maxredirect 重写选项(默认为 10)会阻止它。

    !-f 文件属性测试(如提问者所述)将解决问题,因为 url 将匹配真实文件名:

    RewriteCond %{REQUEST_FILENAME} !-f

    重写规则 ^(.*)$ dispatch.fcgi/$1 [L,QSA]

    现在,如果我们请求 http://example.com/toappend.htaccess 会将其重写为 dispatch.fcgi/toappend,并且不会发生重写循环

    【讨论】:

    • 为什么我做rewriterule .* /index.php会死循环,而我做rewriterule .* index.php却没有死循环?
    • 好的,我找到了答案并写下来链接在这里
    【解决方案2】:

    嘿,在RewriteEngine On之后添加这个

    RewriteCond %{ENV:REDIRECT_STATUS} 200
    RewriteRule .* - [L]
    

    .. 它应该可以停止循环。

    【讨论】:

      【解决方案3】:

      显然——我只是在这里读到这个,我没有第一手的知识——[L] 指令在 .htaccess 文件中不起作用,只有当它在你的 .conf 文件中时才起作用。

      见:Hidden features of mod_rewrite

      在 .htaccess 上下文中,[L] 将 不强制 mod_rewrite 停止。它会 继续触发内部

      【讨论】:

      【解决方案4】:

      遇到同样的问题,事实证明,Apache 2.3.9+ 中的最佳解决方案是使用 END 标志而不是 L 标志,因为它可以防止 mod_rewrite 循环超越规则。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2012-07-14
        • 2020-04-04
        • 1970-01-01
        • 2013-11-24
        • 2013-06-10
        • 2020-04-29
        • 2020-08-19
        • 2011-07-16
        相关资源
        最近更新 更多