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]
サーバ構築の実際がわかる Apache[実践]運用/管理 (Software Design plus)
できるPRO Apache Webサーバー 改訂版 Version 2.4/2.2/2.0対応 できるPROシリーズ
¥1,886 (2025-04-19 18:12 GMT +09:00 時点 - 詳細はこちら価格および発送可能時期は表示された日付/時刻の時点のものであり、変更される場合があります。本商品の購入においては、購入の時点で当該の Amazon サイトに表示されている価格および発送可能時期の情報が適用されます。)2010-06-24