mod_rewriteでURL中の &(アンパサンド)がURLエンコードされない

2007年 7月 3日 00:58

mod_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

もしかすると、もっと簡単なやり方があるかもしれないですが、とりあえず、メモっておきます。


トラックバック URL


※言及リンクのないトラックバックは削除されます。
※書き込まれてから公開されるまで時間がかかる場合があります。

コメント / トラックバック 3 件

  1. ぺんたん より:

    この場合、『&』が2つあると同じ問題が発生しますよね??
    URLに&が入らない想定であれば、受け側で処理することができますが、入る想定なら面倒ですね

  2. mywatertank より:

    情報公開ありがとうございます。
    ぼくも同じ問題で悩んでおりましたがこれで解決できました。
    .htaccessには&が最大で3つのケースまで書きました。
    残念ながら&がいくつあってもマッチするような正規表現はぼくの頭では思いつきませんでした。
    ありがとうございました。

  3. 匿名 より:

    RewriteRule ^search/(.*)$ /search/search.php?q=$1 [NE]
    ではいかがでしょう?
    ‘noescape|NE’ (no URI escaping of output)です。

コメントをどうぞ

Spam protection by WP Captcha-Free

※書き込まれてから公開されるまで時間がかかる場合があります。