mod_rewriteでURL中の &(アンパサンド)がURLエンコードされない
2007年 7月 3日 00:58mod_rewriteを使ってURLを書き換えている時に、URL中の & (アンパサンド)がURLエンコードされなかったので、その対策を考えてみた。
具体的にどういうことかというと、、、
例えば、何かの検索システムで Love&Peace という単語で検索したいとする。書き換えルールは次のような感じで mod_rewrite を使う。(なお、 & マークはURLエンコードされ %26 で表されている。)
http://example.com/search/Love%26Peace
みたいなURLをmod_rewriteを使って
http://example.com/search/search.php?q=Love%26Peace
にしたいとする。
この場合、通常であれば、
RewriteRule ^search/(.*)$ /search/search.php?q=$1
みたいな感じでいけるはずなのですが、この例のように、対象文字列に & マークが入っていると、php側に値が渡った時に、なぜか、& マークが %26 にURLエンコードされず、
http://example.com/search/search.php?q=Love&Peace
という形で渡ってしまう。そうするとphp側では
q=Love
Peace=
というような感じで q と Peace の2つの引数があったと解釈されてしまい、q=Love&Peace という値が渡ってこない。
こうした場合は、どうやら、次のようにするとなんとかうまくいくみたい。
RewriteRule ^search/(.*)&(.*)$ /search/search.php?q=$1\%26$2 [N]
RewriteRule ^search/(.*)$ /search/search.php?q=$1
もしかすると、もっと簡単なやり方があるかもしれないですが、とりあえず、メモっておきます。

2009 年 9 月 21 日 10:03
この場合、『&』が2つあると同じ問題が発生しますよね??
URLに&が入らない想定であれば、受け側で処理することができますが、入る想定なら面倒ですね
2010 年 1 月 10 日 02:30
情報公開ありがとうございます。
ぼくも同じ問題で悩んでおりましたがこれで解決できました。
.htaccessには&が最大で3つのケースまで書きました。
残念ながら&がいくつあってもマッチするような正規表現はぼくの頭では思いつきませんでした。
ありがとうございました。
2010 年 1 月 16 日 21:46
RewriteRule ^search/(.*)$ /search/search.php?q=$1 [NE]
ではいかがでしょう?
‘noescape|NE’ (no URI escaping of output)です。