2012-11-27 40 views
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

相反,第三個規則匹配。

如果我註釋掉第三條規則,那麼第一條規則是有效的。

這是爲什麼?

回答

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] 
相關問題