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

代わりに、3 番目のルールが一致します。

3 番目のルールをコメントアウトすると、最初のルールが機能します。

何故ですか?

4

1 に答える 1

1

現在の書き換え反復のL書き換えを停止するフラグを持っていても、結果 (書き換えられた URI) は書き換えエンジンに戻され、書き換えエンジンに入る URI が変更されないままになるまで、これを続けます。つまり、最初のルールが適用され、次に書き換えエンジンに戻され、そこで 3 番目のルールが適用されます。api.php?params=test

内部リダイレクトが行われた場合は URI を通過するか、これをのすぐ下にRewriteEngine On追加して、すべてのループを無効にすることができます。

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