ソースに '?' が含まれている場合の書き換えルール

ソースに '?' が含まれている場合の書き換えルール

これについては頭を悩ませています。古い URL があります:

     http://myserver/blog/archive?openview&type=Category&key=Demo

新しいURL

     http://myserver/blog/categories/Demo

私はこれに対する書き換えルールを取得しようとしています。次のようになると思います:

     ^/blog/archive\?openview&type=Category&key=(.*) /blog/categories/$1.html [NC,R=301,L]

しかし、それでは何も起こりません。URL とルールを試しました (? を / に置き換えます)。

     http://myserver/blog/archive/openview&type=Category&key=Demo
     ^/blog/archive/openview&type=Category&key=(.*) /blog/categories/$1.html [NC,R=301,L]

そして、それは期待通りに動作します。古い URL で一致させるために ? をどのように処理するか、少し困惑しています。私が見つけたサンプルはすべて、逆のケースを説明しています。つまり、「きれいな」URL を醜い URL に送信します。私の場合、「醜い」URL は過去のユーザーがブックマークしたもので、新しいデータに適切にアクセスできるようにしたいのです。

答え1

少し考えてみる(そして読む)ドキュメント) 後で:

mod_rewriteのマッチはURLのロケーション部分のみを使用します。「?」はロケーションの終わりとパラメータ(別名QueryString)の始まりを示します。これに気づいてから、Googleから

したがって、正しく変換するには、書き換え条件が必要です。

RewriteCond %{QUERY_STRING}     ^openview&type=Category&key=(.*)    [NC]
RewriteRule ^/blog/archive$ /blog/categories/%1.html [NC,R=301,L]

魔法のように機能します

関連情報