我有以下.htaccess:
<IfModule mod_rewrite.c>
RewriteEngine on
RewriteRule ^a/(.*)$ api.php?params=$1 [L,QSA]
RewriteRule ^$ app/webroot/ [L]
RewriteRule (.*) app/webroot/$1 [L]
</IfModule>
我希望当我转到/a/test
时服务器返回/api.php?params=test
相反,第三条规则是匹配的。
如果我注释掉第三条规则,则第一条规则有效。
为什么?
答案 0 :(得分:1)
尽管你有L
标志,它停止重写当前重写迭代的 ,结果(重写的URI)将被放回到重写引擎中,并将继续这样做,直到进入重写引擎的URI没有变化。所以正在发生的是第一个规则被应用,然后api.php?params=test
被放回到重写引擎中,第三个规则被应用。
您可以通过在RewriteEngine On
下方添加此的内部重定向来通过URI来关闭所有循环:
RewriteCond %{ENV:REDIRECT_STATUS} 200
RewriteRule ^ - [L]
或者向第3条规则添加条件,以便它忽略对现有资源的请求:
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule (.*) app/webroot/$1 [L]
或添加明确条件以忽略api.php
:
RewriteCond %{REQUEST_URI} !^/api\.php
RewriteRule (.*) app/webroot/$1 [L]