.htaccess でGETパラメータを維持したままリダイレクトする方法をメモ。
コード
RewriteEngine On
RewriteCond %{QUERY_STRING} (.*)$
RewriteRule ^(.*)$ https://redirected.example.jp/$1?%1 [R=303,L]
こんな感じでOK。
RewriteCond の QUERY_STRING を使ってGETパラメータを取得しています。 RewriteCond の条件に一致した文字列はパーセント始まりの変数に収められるので、 RewriteRule のリダイレクト先URLに ?%1 と付けることで引き継いでいます。
ちなみにリダイレクト先URLに ? が決め打ち的に付いていますが、GETパラメータがない場合は自動的に ? は削除されるようです。例えば、 https://origin.example.jp/hoge.html は https://redirected.example.jp/hoge.html? ではなく、 https://redirected.example.jp/hoge.html にリダイレクトされる、と言った具合です。
そのため、 RewriteCond の条件でも (.+)$ とはせず、 (.*)$ で「0文字以上」としています。
引っかかった場所
さて、処理自体はこれでOKだったのですが、別の場所で引っかかりました。
というのも、検証するのに適切な場所が思い付かなかったので、最初サブディレクトリで試験していました。
条件として、
https://origin.example.jp/fuga/をルートとする.htaccessもhttps://origin.example.jp/fuga/.htaccessに配置https://origin.example.jp/fuga/index.htmlにアクセスする
このような場合に、 https://origin.example.jp/fuga/hoge.html が https://redirected.example.jp/hoge.html にリダイレクトされて、ディレクトリパス fuga/ が消えるという現象が発生します。
後で考えてみればサブディレクトリをルートとして、そこに配置した .htaccess の判定なのでディレクトリパスは吹っ飛びますよね……という単純な話だったのですが、気付かずにしばらく悩んでいました……。
参考
.htaccess
- RewriteRule を .htaccess に記述する際の罠 – 玉虫色に染まれ!!
- .htaccessによるリダイレクト徹底解説 | Cherry Pie Web
- .htaccess の使い方や書き方・設置方法/ Web Design Leaves
- 【mod_rewrite】正規表現 – mod rewrite
GETパラメータを引き継ぐ
- 【Apache】htaccessのRewriteでGETパラメータも残す ・ Logical Dice 技術ブログ
- パラメータ付きURLのリダイレクトについて | 大阪のホームページ制作会社digrart
RewriteRuleのフラグ, RewriteCondの変数
サブディレクトリ
- RewriteRuleによるディレクトリ判定例(サブディレクトリ) -ええかげんブログ(本店)
- htaccess でサブディレクトリをトップディレクトリとして公開する。 – それマグで!
- URLを弄った時のパス対策 | jikkenjo.net