mod_rewriteと&(アンパサンド)

24時間365日戦える営業マンを作りあげます。ホームページコンサルタント山田直毅(なおたか)です。

久しぶりに技術的な記事を書きます。ApacheのURL変換で有用なmod_rewriteですが、パラメータとして設定する際に嫌な文字列がいくつかあります。その一つが「&」です。「&」は通常GETパラメータの区切り文字として使用されます。URLに直書きすると想定した動きにならないことがあります。


一般的にURLで利用できない文字列をURLに指定する場合はURLエンコードを行い、URLで使用できる文字列にします。しかし、mod_rewriteを使用すると丁寧にもURLデコードされた状態からURL変換を実施するので、折角URLエンコードした値が元のURLに適さない文字列に変換されてしまうのです。


解決方法は2つ。


▼URLエンコードを二重にかける
& は URLエンコードを行うと「%26」となります。
% は URLエンコードを行うと「%25」となります。
URLエンコードを二重にかけますと & は 「%2526」となります。mod_rewriteで評価される際は1回だけURLデコードがかかりますから、%25が%となり「%26」の状態で評価されるので、URLエンコードが1回かかった状態でmod_rewriteが評価することになります。


mod_rewrite再帰的に置換する
スマートなのはmod_rewrite再帰的に置換する方法です。.htaccessmod_rewriteの設定を以下の様に設定します。

RewriteEngine on
RewriteRule ^(.*)&(.*)$ $1\%26$2 [N]
RewriteRule ^(.*)$ search.php?filename=$1 [L]

2行目のRewriteRuleの「N」オプションはRule(置換)が適用されたら再度先頭から置換を実施するオプションです。「&」がパラメータに含まれる場合は、再帰的に置換を行います。「&」がパラメータに含まれない状態になると初めて3行目が評価されてURLが置換されます。