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は、クエリの先頭の ? を含まない。そのため、②では ? 無しのクエリがいきなり出力されている。
この記事は書きかけです。