RewriteRuleの正規表現部分ではクエリーが無視される?
presented by 役に立つかもしれないBlog
みんながハマりまくっている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]
関連情報
- 複数のCSSファイルをサーバーでまとめてSEO対策しよう
- mod_rewriteのREQUEST_FILENAMEはSCRIPT_FILENAMEに置き換える
- Y!Slowに「Use cookie-free domains」と言われたY!
- サイト表示を高速化するサーバー設定の実例いろいろ
- DNSの浸透期間に旧サーバーでやっておくこと



コメントフォーム