2011-10-18 9 views
1

これまでのところ私はこれを得ています。最初の部分は動作しますが、リダイレクト自体は動作しません。単純な301リダイレクトが動作しない変数で、なぜですか?

動作させるには何が必要ですか?

RewriteEngine On 
RewriteRule ^([^/\.]+)/?$ page.php?name=$1 [L] 

RewriteRule ^page.php?name=([^/\.]+)/?$ /$1 [R=301,L] 

また、これらのルールが複数ある場合は、最後に[L]のままにしておきますか?

+5

「L」は、「最後」または「ここで処理を中止」を示します。あなたの最初のルールは、すべてではないにしても、ほとんどのURLをキャプチャするので、2番目のURLはまれにしか届かないでしょう。 –

+0

情報ありがとうございます。 – checkenginelight

答えて

1

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

関連する問題