.htaccessでリダイレクトをさせたいとき・・・
- トップページのみ特別な内容にしたり、
- 他ページの内容を表示させたり、
- URLはリダイレクト元のままにしたい...
こういう風にトップページだけリダイレクトしたいこと、ありますよね?
僕自身、そのやり方が分からず数時間迷ったので、
記憶の整理も兼ねて .htaccess でトップページのみリダイレクトする書き方を紹介します。
トップページのみリダイレクトする基本の書き方
やり方は本当に超簡単です。
なんでこんなのに数時間も悩んでたのか、分からなくないくらい
例えば次みたいなディレクトリ・ファイル構成だったとしましょう。
- root(ドキュメントルート)
- index.php
- hoge
- hoge.php
このとき、
index.php にアクセスされたら、
それ本体ではなく
hoge/hoge.php にリダイレクトしたいとします。
そんな場合の書き方例は次の通り!
1 2 3 4 |
RewriteEngine on # トップページのみリダイレクト RewriteRule ^$ hoge/hoge.php [R=301,L] |
この例みたいに、RewriteRule の第1引数に ^$ 、第二引数にリダイレクト先を渡すだけ
「
^$ ってなに?」と思う人もいるかもですが、
ドメイン名以下のパスがない状態でアクセスされた場合を表してます。
例えば http://example.com/ みたいな感じで
あとちなみに・・・
もし index.php にアクセスされた場合もリダイレクトさせたいなら、こう書いてもOK
1 2 3 4 5 |
RewriteEngine on # トップページのみリダイレクト RewriteRule ^$ hoge/hoge.php [R=301,L] RewriteRule ^index.php$ hoge/hoge.php [R=301,L] |
これで
https://example.com/ にアクセスされても
あるいは
https://example.com/ijdex.php でアクセスされても対応できます。
もしクエリ文字列を維持してリダイレクトさせたいなら...
単純にトップページだけリダイレクトさせるなら、上の方法で十分です。
でも クエリ文字列 をリダイレクト先に渡したいこともあるはず
例えば次みたいなURL
1 |
https://example.com/?y=2019&m=07&d=06 |
普通にリダイレクトしちゃうと、
このURL の
?y=2019&m=07&d=06 以降は無視されてしまいます。
それで困るのは、そういうパラメーターをPHP側で受け取りたいときですね。
例えば次コードみたいなこと良くしないですか?
1 2 3 4 5 |
$y = $_GET['y']; $m = $_GET['m']; $d = $_GET['d']; print_r('y = '.$y.', m = '.$m.', $d = '.$d); |
普通にスクリプトにアクセスするなら、問題なく受け取れます。
でもリダイレクトから受け取ると、出力結果はこうなります。
1 |
y = , m = , d = |
クエリ文字列を渡してるはずなのに、受け取れてない!
こういう風に困る訳です。
解決策は QSA フラグを付けてあげること
ではクエリ文字列付きでリダイレクトするにはどうすればいいのか・・
リダイレクトのオプションを少しだけ変えてやればいいだけです。
具体的にいうと、次みたいに [QSA,L] と QSAフラグ を付ければいいだけ
1 2 3 4 5 |
RewriteEngine on # トップページのみリダイレクト RewriteRule ^$ hoge/hoge.php [QSA,L] RewriteRule ^index.php$ hoge/hoge.php [QSA,L] |
たったこれだけで、クエリ文字列も渡せます。
あとそれから・・・
この QSA っていうのは、QSAppend の略みたいです。
実際、httpd の公式ドキュメントでもこう書いてありました。
▼ QSAについての解説(英語)
QSA | qsappend
When the replacement URI contains a query string, the default behavior of RewriteRule is to discard the existing query string, and replace it with the newly generated one. Using the [QSA] flag causes the query strings to be combined.
Consider the following rule:
1 RewriteRule "/pages/(.+)" "/page.php?page=$1" [QSA]With the [QSA] flag, a request for /pages/123?one=two will be mapped to /page.php?page=123&one=two. Without the [QSA] flag, that same request will be mapped to /page.php?page=123 - that is, the existing query string will be discarded.
▼上の説明のスーパー意訳(日本語)
QSA | qsappend
置換先のURLがクエリ文字列を含んでいる場合、RewriteRuleのデフォルト動作はクエリ文字列を捨て、新しいURIに置き換えるみたいな感じです。[QSA] フラグの使用はそのクエリ文字列を連結する作用があります。
例えば次のルールを考えてみましょう。
1 RewriteRule "/pages/(.+)" "/page.php?page=$1" [QSA][QSA]フラグを付けることで、 /pages/123?one=two へのリクエストは /page.php?page=123&one=two にマップされます。もし [QSA]フラグを付けない場合、同じリクエストは /page.php?page=123 にマップされます、すなわちクエリ文字列が破棄されたってこと
こういう便利で素晴らしいオプションがあるので、
「クエリ文字列が渡せないからどうしよう...」、なんて悩む必要はないです。
ここまでのまとめ
以上、htaccess でトップページのみリダイレクトさせる書き方でした。
僕自身、まだまだ .htaccess についてはよく分かってません。
もし分からないことがあれば、色々試していきたいと思います。ではサヨナラ(^^)/~~~