我遇到了将URL重写为fastcgi调度程序的问题。如果我只离开:
RewriteRule ^(.*)$ dispatch.fcgi/$1 [L,QSA]
我希望L
(最后一条规则)只能进行一次重写。相反,它一直在dispatch.fcgi
前置,直到apache报告错误。
我知道可以修复:
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^(.*)$ dispatch.fcgi/$1 [L,QSA]
但多次重写的原因是什么? L
做的事情比我认为的还要多吗?
答案 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循环超过规则。