mod_rewriteでGETパラメータ名を変更する。
mod_rewriteのお話。
旧システムから新システムの以降など、システムの仕様が変わる時でも古いURLを引き継ぎたい場合に役に立つ小技。
問題1
GETパラメータの名前aaaをbbbに変更したい場合はどのようにすれば良いか?
誤
ついつい以下のように設定してしまうかと思いますが、うまく動きません。
RewriteRule filename.html\?aaa=(.*) filename.html?bbb=$1 [L]
正
RewriteCondを使い、QUERY_STRINGの条件を指定すると、うまく動きます。
RewriteCond %{QUERY_STRING} aaa=(.+) RewriteRule filename.html filename.html?bbb=%1 [L]
%1で、RewriteCondでマッチしたパターンを取得できる。
問題2
GETパラメータの名前aaaをbbbに変更したいが、aaa以外のパラメータはそのまま残したい場合はどのようにすれば良いか?
解答1
QSAをつける。
RewriteCond %{QUERY_STRING} aaa=(.+) RewriteRule filename.html filename.html?bbb=%1 [L,QSA]
aaa=○○&ccc=△△だった場合、bbb=○○&aaa=○○&ccc=△△のように、古いパラメータもそのままついてしまう。
解答2
以下の場合、aaaのみbbbに書き換える事ができる。
RewriteCond %{QUERY_STRING} ^(.*)aaa=(.+)$ RewriteRule filename.html filename.html?%1bbb=%2 [L]
オマケ
『上記試してみましたが、うまく動きません!』という場合
上から順に評価されるので、こんな事しているとうまく動かない。
#ファイルが存在する場合はそれを表示する RewriteCond %{REQUEST_FILENAME} -f [OR] RewriteCond %{REQUEST_FILENAME} -d RewriteRule ^.* - [L] # ↑ファイルが存在した時点で、上記が評価されて終わってしまう。 #パラメータ名を書き換える。 RewriteCond %{QUERY_STRING} ^(.*)aaa=(.+)$ RewriteRule filename.html filename.html?%1bbb=%2 [L]
順番を変更する事でうまく動く。
#パラメータ名を書き換える。 RewriteCond %{QUERY_STRING} ^(.*)aaa=(.+)$ RewriteRule filename.html filename.html?%1bbb=%2 [L] #↑先に評価される。 #ファイルが存在する場合はそれを表示する RewriteCond %{REQUEST_FILENAME} -f [OR] RewriteCond %{REQUEST_FILENAME} -d RewriteRule ^.* - [L]
そんな感じで、お役に立てれば幸いです。
関連記事
[Apache][mod_rewrite]続:存在するファイルはスルーしたい
The Definitive Guide to Apache mod_rewrite (Definitive Guides (Hardcover))
- 作者: Rich Bowen
- 出版社/メーカー: Apress
- 発売日: 2006/02/22
- メディア: ハードカバー
- クリック: 32回
- この商品を含むブログ (3件) を見る
Apacheクックブック 第2版 ―Webサーバ管理者のためのレシピ集
- 作者: Ken Coar,Rich Bowen,笹井崇司
- 出版社/メーカー: オライリージャパン
- 発売日: 2008/09/26
- メディア: 大型本
- 購入: 6人 クリック: 144回
- この商品を含むブログ (32件) を見る