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

vir*_*tor 6 apache mod-rewrite

我有一个问题,重写URL到fastcgi调度程序.如果我只离开:

RewriteRule ^(.*)$ dispatch.fcgi/$1 [L,QSA]
Run Code Online (Sandbox Code Playgroud)

我期望L(最后一条规则)只能进行一次重写.相反,它会继续预先添加,dispatch.fcgi直到apache报告错误.

我知道它可以修复:

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

但多次重写的原因是什么?是否L做别的事情比我想象的那样?

Den*_*app 8

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

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

但是,如果请求url已被重写,则.htaccess文件末尾,整个url匹配过程将再次使用新url启动.

这是上面发生了什么,^(.*)$始终与当前的URL,它会导致一个无限循环,只有maxredirect重写选项(默认值为10)停止.

!-f文件属性测试(由提问者提到的)会解决这个问题,因为该网址将匹配一个真实的文件名:

RewriteCond%{REQUEST_FILENAME}! - f

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

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


puf*_*fos 6

Hy,之后补充一下 RewriteEngine On

RewriteCond %{ENV:REDIRECT_STATUS} 200
RewriteRule .* - [L]
Run Code Online (Sandbox Code Playgroud)

..它应该工作停止循环.