RewriteRuleの正規表現部分ではクエリーが無視される?
みんながハマりまくっているmod_rewriteにて久しぶりに罠にかかったので、みなさまにも情報共有っす。
RewriteRuleでは最初に書き換えパスに一致させる文字列を正規表現で特定しますが、この部分ではクエリー文字列(?を含む、以降の文字列)が無視されてしまうことがわかりました。
今回やりたいこと
http://example.com/hoge/page/ ↓ http://example.com/1/page/?id=hoge
に置き換えること。
.htaccessに書いた内容
最初に書いたのがこれ。
RewriteEngine On RewriteRule ^([^/]+)/page/$ 1/page/?id=$1 [L]
置き換え後にはクエリーが付いているので、再度一致してしまうことはないはず…でしたが、実際「http://example.com/hoge/page/」にアクセスすると、最終的に
http://example.com/1/page/?id=1
となってしまい、再度一致してしまっている様子。 ということでクエリーがRewriteRuleのマッチ条件で無視されている!と判明したわけです。
RewriteCondにクエリーが空であることを条件で加えて解決
結局、クエリーが付いていないことを置き換え条件に加えることで、この問題は無事解決したのでした。
RewriteEngine On RewriteCond %{QUERY_STRING} ="" RewriteRule ^([^/]+)/page/$ 1/page/?id=$1 [L]
2010-06-24