.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