2番目のルールをオーバーライドする最初のルールのほかに、2番目のルールは、RewriteRuleのクエリ文字列と一致させようとしているため動作しません。代わりに、このような何か試してみてください:
RewriteEngine On
RewriteBase/
RewriteCond %{QUERY_STRING} ^name=([^/.&]+)/?$
RewriteCond %{ENV:REDIRECT_LOOP} !1
RewriteRule ^page\.php$ /%1? [NS,R=301,L]
RewriteRule ^([^/.]+)/?$ page.php?name=$1 [NS,QSA,E=LOOP:1]
を(。/foobar?foo=bar
のようなURLだけではなく、/page.php?name=foobar
の/page.php?name=foobar&foo=bar
に書き換えられますようにあなたがそれをしたくない場合は、それを残して、私はQSA
フラグを含む。)
注:第RewriteCond
が第1のマッチした後に再びマッチングから最初のルールを維持することがあります。問題は、.htaccessコンテキストでは、mod_rewriteがのようにすべてのフラグがPT
というフラグを持つように動作し、ルールセットがすべての書き換え後、さらには内部のものまで再実行されるという問題です。または、to quote the documentation:。
「あなたは>セクションのいずれかで.htaccessファイルまたは< DirectoryでのRewriteRuleを使用している場合、それはルールがどのように処理されるかをある程度理解することが重要である。この単純化した形は、かつてありますルールが処理された後、書き換えられた要求がURL解析エンジンに渡され、何が行われるかが行われます。書き換えられた要求が処理されると、.htaccessファイルまたは<ディレクトリ>セクションが再度発生する可能性があります。ルールセットが最初から再度実行される可能性があります。ルールの1つが内部または外部のリダイレクトを引き起こし、リクエストプロセスをやり直す原因になるのが最も一般的です。
私が使用している回避策は、外部の書き換えを行う前に、内部の書き換えが発生したときにE=LOOP:1
でカスタム環境変数を設定し、それをチェックすることです。内部リライト後にリクエスト処理が再開すると、Apacheは前回のパスで設定されたすべての環境変数の名前にREDIRECT_
を追加するので、設定した変数の名前はちょうどLOOP
ですが、確認する必要があるのはREDIRECT_LOOP
。
「L」は、「最後」または「ここで処理を中止」を示します。あなたの最初のルールは、すべてではないにしても、ほとんどのURLをキャプチャするので、2番目のURLはまれにしか届かないでしょう。 –
情報ありがとうございます。 – checkenginelight