«前の日記(2008-10-31) 最新 次の日記(2008-12-01)» 編集

Don'tStopMusic

2003|07|08|09|10|11|12|
2004|01|02|03|04|05|06|07|08|09|10|11|12|
2005|01|02|03|04|05|06|07|08|09|10|12|
2006|01|02|03|04|05|07|08|09|10|11|12|
2007|01|02|03|04|05|06|07|08|09|10|11|12|
2008|01|02|03|04|05|06|08|09|10|11|12|
2009|01|02|05|06|

カテゴリ別 2003年 | 2004年 | 2005年 | 2006年 | 2007年 | 2008年

知り合いサイト: よんだもの / 暴想 / Linuxでやる夫 / 新宿Vipper / 僕だけが幸せになればいいのに。


2008-11-17

_ [Apache] mod_rewrite でクエリ中の特定のパラメタを削除する このエントリーを含むブックマーク

課題

例えば、

http://dontstopmusic.no-ip.org/hoge/show?bar=1&foo=1

から要らないパラメタ foo=1 を消して

http://dontstopmusic.no-ip.org/hoge/show?bar=1

にしたい場合です。ライブラリ、フレームワーク、外部のリダイレクタなどが余計なパラメタをつけるので URL の正規化をしたいなあという用途に。

解決策

mod_rewrite を使います。

mod_rewrite は便利ですが、基本的にパスに対する操作しかできません。普通に RewriteRule を書いてもクエリーストリング部分は無視されてしまいます。なので、一旦クエリーストリングをパスに追加してから操作することにします。ルールはこちら。

RewriteCond %{QUERY_STRING} foo=1
RewriteRule ^(.*)$ $1#%{QUERY_STRING} [C]
RewriteRule ^(.*)#(|.*&)foo=1(&|$)(.*) $1?$2$4 [R=301,L,NE]

最初に挙げた URL に対して、以下のようにマッチングと書き換えが行われます。

1. QUERY_STRING bar=1&foo=1 が foo=1 にマッチするので続くルールを適用
2. ^(.*)$ に /hoge/show がマッチ。
   $1=/hoge/show
   /hoge/show → /hoge/show#bar=1&foo=1 に書き換え
3. ^(.*)#(|.*&)foo=1(&|$)(.*) に /hoge/show#bar=1&foo=1 にマッチ。
   $1=/hoge/show $2=bar=1& $3=
   /hoge/show#bar=1&foo=1 → /hoge/show#bar=1 に書き換え

既知の問題点

# を結合子/分離子に使っているので、元々パスに # が含まれていると正しく動作しません。他にも何かありそうなので、ご利用の際にはちゃんと確認してからお願いします。

お名前:
E-mail:
コメント:
[]

最近のコメント:

RSS
Creative Commons License
This work is licensed under a Creative Commons License
(note: text only. w/o web design, citations, (re)distributed softwares).