質問: クエリー文字列が含まれるURLを.htaccessでリダイレクトしたい を へ転送したい 転送元と転送先は同じドメインです。 wordpressでの運用をやめて、手動でurlをつけるサイトにしようと考えています。 転送元の?p=以下の数字と、転送先のファイル名に規則性はありません。 Redirect permanent /?p=123 Redirect permanent /?p=666 Redirect permanent /?p=007 コードをこのように書いても、クエリー文字列が含まれているためリダイレクトできませんでした。 いろいろ調べたところmod_rewriteというものを使うらしいということが分かったのですが、書き方が全く分かりません。 そこで、この場合の正しいコードを教えて下さい。 よろしくお願いします。
回答: .htaccessかhttpd.confに以下のように設定してやれば良いです。 ``` RewriteEngine on RewriteCond %{QUERY_STRING} (^|&)p=123(&|$) RewriteRule ^/?$ /new.html? [L,R=301] RewriteCond %{QUERY_STRING} (^|&)p=666(&|$) RewriteRule ^/?$ /shin.html? [L,R=301] RewriteCond %{QUERY_STRING} (^|&)p=007(&|$) RewriteRule ^/?$ /sara.html? [L,R=301] ``` ざっと説明すると、 * RewriteEngine on はmod_rewriteを有効にするという意味です。 * リダイレクトの設定はRewiteRuleで行うものですが、RewriteRuleではクエリ文字列を条件にできないのでRewriteCondと合わせて使います。 * RewriteCond では QUERY_STRING 中に p=123 が含まれているという条件を次の行のRewriteRuleに追加しています。 * RewriteCond の第2引数は正規表現です。詳細に説明すると、最初の(^|&)はpp=などのパラメータを除外するためのもので、pの直前はクエリの先頭もしくは&であることを意味します。最後の(&|$)はp=1234などを除外するためのもので、p=123の直後は&かクエリの最後であることを意味します。 * RewriteRule ではRewriteCondの条件に加えてクエリ文字列を除外したパスが / であることを条件にしてリダイレクトするように指定しています。 * RewriteRule の第1引数は正規表現です。^は行頭、$は行末、/? は / 1文字もしくは0文字を意味します。つまりパス部分が / のみという意味です。? を書いて / がゼロ文字の時も許容しているのは httpd.conf の時は / から始まりますが、.htaccess の場合は行頭の / が無いのでそれに対応するために ? をつけています。 * RewriteRule の第2引数は書き換え先のパスです。最後に ? をつけているのはクエリ文字列を空で上書きするためです。この?を付けないと /new.html?p=123 にリダイレクトされてしまいます。ちなみに /news.html? になってしまいそうですがそうはならずちゃんと /news.html に飛んでくれます。mod_rewriteはクエリが空なことを理解して?を勝手に消してくれます。 * RewriteRule の第3引数はどのような書き換えを行うかのオプションです。Lはこのルールを実行したら最後を意味し、Rはリダイレクト、R=301は特にpermanentなリダイレクトをすることを意味します。 ざっとと言いましたが、たった2行に結構な意味が込められてますねw mod_rewriteは慣れれば便利ですが慣れないと難しいかと思います(^^; が、今回のようなリダイレクトならこの例を真似て複数記述するだけで使い物になるんじゃないかと思います。