即使使用L标志,mod_rewrite也会循环

时间:2010-01-24 13:05:36

标签: apache mod-rewrite

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

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

我希望L(最后一条规则)只能进行一次重写。相反,它一直在dispatch.fcgi前置,直到apache报告错误。

我知道可以修复:

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

但多次重写的原因是什么? L做的事情比我认为的还要多吗?

4 个答案:

答案 0 :(得分:8)

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

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

但是,如果请求网址已被重写,则在.htaccess文件的末尾,整个网址匹配流程将再次使用新网址启动。

以上是这种情况,^(.*)$始终匹配当前网址,导致无限循环,只有maxredirect重写选项(默认为10)才会停止

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

  

RewriteCond%{REQUEST_FILENAME}!-f

     

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

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

答案 1 :(得分:6)

Hy,在RewriteEngine On

之后添加
RewriteCond %{ENV:REDIRECT_STATUS} 200
RewriteRule .* - [L]

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

答案 2 :(得分:2)

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

请参阅:Hidden features of mod_rewrite

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

答案 3 :(得分:0)

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