mod_rewrite
Apache

勘違いしやすいmod_rewriteの[QSA]フラグの仕様

More than 3 years have passed since last update.

RewriteRuleの[QSA]フラグは、元のURLからQueryStringを引き継ぐためのもの、ではない

QueryStringは、デフォルトで引き継がれる。以下の例で、/foo?var=1 にアクセスすれば、 /bar?var=1 に書き換えられる。


.htaccess

RewriteRule ^foo$ /bar [L]


[QSA]フラグが意味を持つのは、書き換え後のURLにQueryStringが存在する場合だけである。デフォルトでは、元のURLのQueryStringは破棄されるが、[QSA]を指定すると結合されるようになる。

以下の例で、 /aaa?var=1 は /replace?var=2 になるが、/bbb?var=1 は /append?var=2&var=1 になる。


.htaccess

RewriteRule ^aaa$ /replace?var=2 [L]

RewriteRule ^bbb$ /append?var=2 [L,QSA]

……

この挙動の違いを利用すると、QueryStringを消去することもできる。[QSA]をつけずに、書き換え後のURLに空のQueryString(?だけ)を指定すると、QueryStringは消去される。

以下の例では、/foo に QueryStringが付いている場合、消去して301リダイレクトする。


.htaccess

RewriteCond %{QUERY_STRING} .+

RewriteRule ^foo$ /$0? [L,R=301]

Apache 2.4.0 からは、この用途のための[QSD]フラグが加わったので、次のように書くこともできる。


.htaccess

RewriteCond %{QUERY_STRING} .+

RewriteRule ^foo$ /$0 [L,R=301,QSD]