1

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

而是匹配第三条规则。

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

这是为什么?

4

1 回答 1

1

即使你有一个L标志,它会为当前的重写迭代停止重写,结果(重写的 URI)将被放回重写引擎,并将继续这样做,直到进入重写引擎的 URI 保持不变。所以发生的事情是第一个规则被应用,然后api.php?params=test被放回重写引擎,第三个规则被应用。

您可以关闭所有循环,如果进行了内部重定向,则通过 URI 传递,方法是在下面RewriteEngine On添加:

RewriteCond %{ENV:REDIRECT_STATUS} 200
RewriteRule ^ - [L]

或者向第三条规则添加一个条件,使其忽略对现有资源的请求:

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]
于 2012-11-27T11:17:47.483 回答