为什么匹配的重写不起作用?

时间:2012-11-27 10:47:17

标签: apache mod-rewrite

我有以下.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

相反,第三条规则是匹配的。

如果我注释掉第三条规则,则第一条规则有效。

为什么?

1 个答案:

答案 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]