ここに書かれている内容を「.htaccessでクエリ付きURLをリダイレクトする方法」に詳しく記載しました。
.htaccessでのリダイレクト、リライトの試行錯誤の話。
SEO的な問題でどうしてもクエリ付きURIの301リダイレクトが必要になり調べました。
初めは「Redirect」を使って簡単にできると思っていました。
しかし、どうやら僕のやりたいことをするには「Redirect」ではなく「Rewrite」を使う方法だということが判明。
RewriteEngine On
RewriteRule ^aaa/bbb.php?(.*)$ /ccc.php?xx=yyy&$1 [R=301,L]
まずはこんな感じで記述
結果、$1のところに何も入っていない
調べてみると「?」以降、つまりクエリの部分を取り除いてしまうらしい。
この場合のクエリは「%{QUERY_STRING}」に代入されるとのこと
そこで以下に書き換え
RewriteEngine On
RewriteRule aaa/bbb.php /ccc.php?xx=yyy&%{QUERY_STRING} [R=301,L]
これ リダイレクトはうまくいったものの、わけわからん文字が並んでる。
てかエンコードされた文字がそのまま(?)でてくる
そのままじゃない
エンコードされた文字の「%」がさらにエンコード(エスケープ)されて「%25」になっている。
ようはこんな感じ
/bbb.php?zz=むんじゃ(エンコード前)
/bbb.php?zz=%82%de%82%f1%82%b6%82%e1(エンコード)
/bbb.php?zz=%2582%25de%2582%25f1%2582%25b6%2582%25e1(%をエスケープ)
何か方法はないかと、書き方を変えてみる
RewriteEngine On
RewriteCond %{QUERY_STRING}
RewriteRule aaa/bbb.php /ccc.php?xx=yyy&%1 [R=301,L]
…変化無し
発見! なんの根拠もないけどこれならいけると思った。
フラグを使うやり方。
QSA(query string append)を使うと勝手にクエリ部分を書き換え後の文字列に追加してくれるらしい。
RewriteEngine on
RewriteCond %{QUERY_STRING} .+
RewriteRule aaa/bbb.php /ccc.php?xx=yyy [QSA,R=301,L]
うん 一緒ね
結局エスケープ
どうしたらエスケープさせないようにできるのか。
もうどれだけググったかわからない。
一体何サイト、何ページ見たことか。
同じところも何度も見た。
同じような状況での質問、回答などがあるページはいくつもあったもののどれもうまくいかない。
もうほとんど諦めていた。
休憩した後
雄晟を抱っこしたまま軽い気持ちでmod_rewriteについて書かれたページを見ていた。
何度も見たページ。
今 何故ここを再び開いたかも覚えていない。
文字ばっか
仕様のようなものが書かれてる。
わけがわからん。
RewriteRuleを何度も何度も書き換えて試したけどダメだった。
そこじゃないから
フラグだから
ボーっと見ていたmod_rewriteについて書かれたページから目に飛び込んで来た文
「エスケープルールを適用しないようにします」
NE
たったこれだけ!
フラグだから
これだけ
RewriteEngine on
RewriteCond %{QUERY_STRING} .+
RewriteRule aaa/bbb.php /ccc.php?xx=yyy [NE,QSA,R=301,L]
とうとうできた!
ありがとう雄晟♪