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