web-dev-qa-db-ja.com

Apacheサーバー上の.htaccessファイル内のRewriteRulesの優先順位

.htaccessファイルにいくつかのRewriteRulesがあります。ただし、1つの特定のルールは、2つのルールの順序に関係なく、別の特定のルールを削除した場合にのみ実行されます。

優先度が「低い」と思われるルールは次のとおりです。

RewriteRule ^([0-9]+)$ /beta/forward.php?id=$1 [L]

そして、これが常に優先されるルールです:

RewriteCond %{HTTP_Host} ^domain1\.net$ [NC]
RewriteRule ^(.*)$ http://domain2.net/$1 [R=301,L]

Domain1とdomain2はどちらも、実際には同じWebサイトを指しています。したがって、両方のルールが.htaccessファイルにあり、私がアクセスするときはいつでも

http://domain1.net/123

2番目のルールが最初に実行され、最初に http://domain2.net/123 に、次に(ホスト名が2番目のルールに適合しなくなったときに)2つのリダイレクトが発生します。 )から http://domain2.net/beta/forward.php?id=123 。 2番目のルールを修正して、数字のみを含むURLに対して実行されないようにしましたが、stillが取得されるため、何か間違ったことをしている必要があります実行:

RewriteCond %{HTTP_Host} ^ domain1\.net$ [NC]
RewriteRule ^(.*[^0-9]+.*)$ http://domain2.net/$1 [R=301,L]

.htaccessファイルから2行を削除するだけで、リクエストをすぐに処理する最初のルールを取得できます。

どんな助けでも大歓迎です。

5
LKM

ルールは次の手順を示しています。

URLが数字のみの場合は、ベータURLに移動し、その後にそれらの数字を続けて停止します。

Domain1にアクセスする場合は、domain2の同じURLに移動して停止します。

Lが検出されるか、ルールが終了すると、処理は終了します。他に起こっていることは、ブラウザからの新しい接続です。これはおそらくあなたにとって混乱していることです—順序が重要であり、次に一致します。 Lは、問題が発生したときに問題を解決する必要があります。

_RewriteEngine on_

RewriteRule ^([0-9]+)$ /beta/forward.php?id=$1 [L]#数値のみの場合は[L]の処理を終了します

_RewriteCond %{HTTP_Host} ^domain1\.net$ [NC]_#domain1.netの大文字と小文字を区別しない一致の場合…

RewriteRule ^(.*)$ http://domain2.net/$1 [R=301,L]#domain2.netにリダイレクトします。終了[L]

4
Jeremy L

書き換えルールのフラグを確認する必要があると思います( http://httpd.Apache.org/docs/2.0/mod/mod_rewrite.html#rewriterule )CフラグとLフラグの機能に注意してください。

2
kargig