web-dev-qa-db-ja.com

クエリ文字列変数をmod_rewriteと一致させるにはどうすればよいですか?

次のようなクエリ文字列パラメーターを持つURLがあるとします。

/index.php?book=DesignPatterns&page=139
/index.php?book=Refactoring&page=285

mod_rewrite を使用して、これらをこのようなSES URLにリダイレクトするにはどうすればよいですか?

/DesignPatterns/139
/Refactoring/285
48
RewriteCond %{QUERY_STRING} book=(\w+)&page=(\d+)  
RewriteRule ^index.php /%1/%2? [L,R=301]

RewriteRule はパス(疑問符まで)のみを調べるため、 RewriteCond を使用してクエリ文字列の値を取得します。

RewriteCondからの一致は、%1%2などではなく、$1$2などにキャプチャされることに注意してください。

RewriteRuleの最後にある?にも注意してください。これは、元のクエリ文字列を新しいURLに追加しないようにmod_rewriteに指示するため、/DesignPatterns/151の代わりに/DesignPatterns/151?book=DesignPatterns&page=151が使用されます。

[L,R=301]フラグは次の2つのことを行います。

  1. Lは、他の方法では一致する可能性のある他のルールが処理されないことを保証します(つまり、これが処理される「最後の」ルールであることを保証します)。
  2. R=301を指定すると、サーバーはリダイレクト応答を返します。書き換えるのではなく、新しいURLで再試行するようにクライアントに指示します。 =301永続的なリダイレクト にするため、特に、検索エンジンはインデックス内の古いURLを新しいURLに置き換えることを認識します。
101