.htaccessでリダイレクトをさせるときにクエリを削除したかったのですが、変なところで微妙にハマったのでメモ書きです。
対応例
例として、
http://example.com/hoge/?fuga=piyo
から
http://example.com/
へリダイレクトさせるとします。
解決法
クエリを削除するには、RewriteRuleの転送先URLの末尾に「?」(半角クエスチョンマーク)を指定すればOKです。
コード
上手くいかない例
RewriteCond %{REQUEST_URI} ^/hoge/$
RewriteRule ^(.*)$ /? [R=301,L]
上記の例だとクエリが削除されず、パラメータを引き継いだ状態で
http://example.com/?fuga=piyo
へとリダイレクトされてしまいます。
上手くいく例
RewriteCond %{REQUEST_URI} ^/hoge/$
RewriteRule ^(.*)$ http://example.com/? [R=301,L]
どうやら、RewriteRuleの転送先URLを指定する箇所をサイトルート相対パスで記述しているときちんとクエリが削除されてくれないようです。なので、クエリを削除したい場合はきちんとフルパスでURLを記述しましょう。
RewriteCond %{REQUEST_URI} ^/hoge/$
RewriteRule ^(.*)$ http://%{HTTP_HOST}/? [R=301,L]
こちらの記述でもOKです。
ただし、「http://」の部分はどうしようもなさそうなので、ここは固定で記述するしかなさそうです。
おまけ
RewriteCond %{HTTPS} off
RewriteCond %{REQUEST_URI} ^/hoge/$
RewriteRule ^(.*)$ http://%{HTTP_HOST}/? [R=301,L]
RewriteCond %{HTTPS} on
RewriteCond %{REQUEST_URI} ^/hoge/$
RewriteRule ^(.*)$ https://%{HTTP_HOST}/? [R=301,L]
こうすれば本番環境とテスト環境でそれぞれSSL対応・非対応で分かれていても対応できますが、コードが冗長になってる感が否めず若干気持ち悪いです。ってかクエリを削除するだけなのに6行も使うのはいかがなものか。
どなたかいい解決法があったら教えてください。