4
6

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

【.htaccess】リダイレクトを行う際にクエリを削除する

Last updated at Posted at 2018-08-08

.htaccessでリダイレクトをさせるときにクエリを削除したかったのですが、変なところで微妙にハマったのでメモ書きです。

対応例

例として、
http://example.com/hoge/?fuga=piyo
から
http://example.com/
へリダイレクトさせるとします。

解決法

クエリを削除するには、RewriteRuleの転送先URLの末尾に「?」(半角クエスチョンマーク)を指定すればOKです。

コード

上手くいかない例

.htaccess
RewriteCond %{REQUEST_URI} ^/hoge/$
RewriteRule ^(.*)$ /? [R=301,L]

上記の例だとクエリが削除されず、パラメータを引き継いだ状態で
http://example.com/?fuga=piyo
へとリダイレクトされてしまいます。

上手くいく例

.htaccess
RewriteCond %{REQUEST_URI} ^/hoge/$
RewriteRule ^(.*)$ http://example.com/? [R=301,L]

どうやら、RewriteRuleの転送先URLを指定する箇所をサイトルート相対パスで記述しているときちんとクエリが削除されてくれないようです。なので、クエリを削除したい場合はきちんとフルパスでURLを記述しましょう。

.htaccess
RewriteCond %{REQUEST_URI} ^/hoge/$
RewriteRule ^(.*)$ http://%{HTTP_HOST}/? [R=301,L]

こちらの記述でもOKです。
ただし、「http://」の部分はどうしようもなさそうなので、ここは固定で記述するしかなさそうです。

おまけ

.htaccess
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行も使うのはいかがなものか。

どなたかいい解決法があったら教えてください。

4
6
1

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
4
6

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?