「L」フラグは、後続のルールが適用されないようにするためのものだと思いました。しかし、この例では:
RewriteRule foo bar [L]
RewriteRule bar qux
とhttp://mysite/foo
書き換えられhttp://mysite/qux
ます。私は期待しhttp://mysite/bar
た。ここで何が欠けていますか?
「L」フラグは、後続のルールが適用されないようにするためのものだと思いました。しかし、この例では:
RewriteRule foo bar [L]
RewriteRule bar qux
とhttp://mysite/foo
書き換えられhttp://mysite/qux
ます。私は期待しhttp://mysite/bar
た。ここで何が欠けていますか?
はじめにmod_rewrite
より:
LogLevelディレクティブを使用して、 mod_rewrite のログ レベルをいずれかのトレース レベルに設定してください。各ルールがどのように処理されるかを正確に教えてくれるので、mod_rewrite 設定の問題をデバッグするには不可欠です。
Apache 2.4 で mod_rewrite トレースをオンにするには、次を使用できます。
LogLevel info mod_rewrite:trace3
ただし、Apache 2.2 (現在のプロダクションで人気のあるもの) では、次を使用する必要があります。
RewriteLog "/var/log/apache2/rewrite.log"
RewriteLogLevel 3
あなたの設定
RewriteRule foo bar [L]
RewriteRule bar qux
希望どおりに動作させるには一度だけ実行する必要があるため、問題があります。2.2のL フラグは、ルールがディレクトリまたは .htaccess コンテキストで使用されている場合、あなたが考えていることを行いません。
.htaccess ファイルまたはセクションで RewriteRule を使用している場合は、ルールがどのように処理されるかをある程度理解しておくことが重要です。これを簡略化すると、ルールが処理されると、書き換えられたリクエストが URL 解析エンジンに返され、可能な処理が行われます。書き換えられた要求が処理されると、.htaccess ファイルまたはセクションが再び検出され、ルールセットが最初から実行される可能性があります。最も一般的なのは、ルールの 1 つがリダイレクト (内部または外部のいずれか) を引き起こし、リクエスト プロセスが最初からやり直された場合です。
ただし、これらのルールをサービス構成または仮想ホスト コンテキストに移動することは機能します。(私のローカルサーバーで確認済みです。)
一般に、処理回数に関係なくルールを作成する必要があります。絶対にそれができない場合RewriteCond %{THE_REQUEST} ^GET\ /bar
でも、ループを回避するために使用するのは好きRewriteCond %{THE_REQUEST} ^[^ ]+ /bar
ではありませんが、現時点では Apache 2.2 に関する提案はありません。
Apache 2.4 には、まさにこの状況のためのENDフラグがあります。