はにまログ

「はにまる」のようにゆるーく生きたい。

mod_rewrite の %{QUERY_STRING} の使い方

はまったのでメモ。

【要件】
・末尾が、index.htmlの場合、一つ手前にURLを切り戻してそのパス名で、.htmlとする。
 例)/foo/index.html の場合、
   /foo.html
・さらに末尾にクエリやアンカーが着く事があるので、それをそのまま引き継ぎたい。
 例)/foo/index.html?query1=abc&query2=def#bottom の場合、
   /foo.html?query1=abc&query2=def#bottom
【指示】
mod_rewriteでクエリを表現するには、%{QUERY_STRING}を使うと良い。

① 一旦、%{QUERY_STRING}を使わずに試作してみる。
  RewriteRule ^/(.*/)?index.html(\?.*)?$ /$1.html$2 [R=301,L]
  まずは、これでうまく行った。

② 次に、$2の代わりに、%{QUERY_STRING} を設置してみた。
  RewriteRule ^/(.*)/?index.html(\?.*)?$ /$1.html%{QUERY_STRING} [R=301,L]
  すると、2重でクエリが出力されちゃう。

例)/foo/index.html?query1=abc の場合
  /foo.htmlquery1=abc?query1=abc

この記事を見ると
http://d.hatena.ne.jp/mrgoofy33/20101021/1287672461

「RewriteRule」で書き換えられる側のURIには「クエリ文字列(URLパラメタ)が含まれない」

つまり、
①の$2でクエリが取れたのではなく、どこかわからないが、別の設定により勝手にクエリが付与される。この影響で、②ではまず %{QUERY_STRING} のクエリ文字列が付与され、その後どこかで勝手にクエリが付与された。
そして、QUERY_STRINGは、クエリの先頭の ? を含まない。そのため、②では ? 無しのクエリがいきなり出力されている。

この記事は書きかけです。