mod_rewrite: Web ページにリダイレクト ループがあります

mod_rewrite: Web ページにリダイレクト ループがあります

次のように、ホスト名の直後にパラメータを指定しようとしています。

www.domain.com/パラメータ

このため、操作したい 2 つのパラメータ値に対して、次の rewriteRule を設定しました。

RewriteRule ^(en|pt)$ /index.php?language=$1&%{QUERY_STRING} [L]

正常に動作します。ただし、リストされているパラメータが 1 つもないリクエストをリダイレクトするには、新しいルールを作成する必要があります。

そのため、私はこれがうまくいくと考えました:

RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_URI} !^(en|pt)$
RewriteRule ^(.*)$ /pt/$1/ [L,R=301]

しかし残念ながらリダイレクト ループが表示されています。

私は以下を受け取っています:

http://hostname/pt/pt/pt/pt/pt/pt/pt/pt/pt/pt/pt/pt/pt/pt/pt/pt/pt/pt/pt/pt/pt//

これを修正する方法に関するヒントがあれば、ぜひ教えてください。

答え1

それはディレクトリない通常のファイル

Apache のドキュメントid(スニペットのHTML DOM がありません。最も近いのは無関係な でありLA-U、 であるはずのものも id="LA-F"欠落しています。)

さまざまなファイル属性テストを実行できます。

'-d' (is directory)
Treats the TestString as a pathname and tests whether or not it exists, and is a directory.
'-f' (is regular file)
Treats the TestString as a pathname and tests whether or not it exists, and is a regular file.

残りの設定が正しい場合 (末尾にスラッシュを追加するのが良いアイデアかどうかはわかりません)、次の追加条件を追加する必要があります!-d

RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_URI} !^(en|pt)$
RewriteRule ^(.*)$ /pt/$1/ [L,R=301]

また、nginx への切り替えも検討してください。より一般的な使用に適した明確な構文を備えているだけでなく、関連するドキュメントへの直接リンクも用意されています。http://nginx.org/r/if

「-e」および「!-e」演算子を使用してファイル、ディレクトリ、またはシンボリック リンクの存在を確認します。

答え2

%{REQUEST_URI}はホスト名の直後の URI パスなので、スラッシュで始まります。/

RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_URI} !^/(en|pt)$
RewriteRule ^.*$ /pt/$0/ [R=301,L]

関連情報