I've got a problem with rewriting a URL to a fastcgi dispatcher. If I leave only:
RewriteRule ^(.*)$ dispatch.fcgi/$1 [L,QSA]
I expected L
(last rule) to cause only a single rewrite. Instead, it keeps prepending dispatch.fcgi
until apache reports an error.
I know it can be fixed with:
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^(.*)$ dispatch.fcgi/$1 [L,QSA]
But what is the reason for multiple rewrites? Does L
do something else than I think it does?
I know it's an old question, but to others searching for the REAL answer, here it is:
The [L]
flag DOES work in .htaccess
files. It tells the rewrite module
to skip all of the following rules in that particular .htaccess
file. It does its job, Apache rewrites the url and exits the .htaccess
file.
However, at the end of the .htaccess
file if the request url has been rewritten, the whole url matching process starts again with the new url.
This is what happens above, ^(.*)$
will always match the current url, it causes an infinite loop, only the maxredirect
rewrite option (10 by default) stops it.
The !-f
file attribute test (as mentioned by the questioner) would solve the problem, since the url will match a real filename:
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^(.*)$ dispatch.fcgi/$1 [L,QSA]
now, if we request http://example.com/toappend
, .htaccess
rewrites it to dispatch.fcgi/toappend
and no rewrite loop will happen.
Hy , add this after RewriteEngine On
RewriteCond %{ENV:REDIRECT_STATUS} 200
RewriteRule .* - [L]
.. and it should work stoping loops .
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With