HTML,CSS,Javascript,PHPを中心に、WEB制作時に忘れがちなTipsを紹介など。
# wwwなしアクセスを強制
RewriteCond %{HTTP_HOST} ^www\.(.*)
RewriteRule ^(.*)$ https://%1/$1 [R=301,L]
RewriteCondはアクセスしてきたドメイン名に対して、正規表現でwwwの有無を確認しています。
上記の例では先頭にwwwが含まれる場合にRewriteRuleを適用します。
RewriteRuleではすべてのアクセスに対してURLリダイレクトを適用しています。
「https://%1/$1」の「%1」と「$1」についてですが、「%1」はRewriteCondの正規表現にマッチしたグループの1つ目というような意味合いです。つまり、RewriteCondの「(.*)」にマッチした文字列のこと。
ドメイン名に対しての正規表現なので、ドメイン名のうち「www.」より後ろの文字列が「%1」に代入されます。
「$1」については、RewriteRuleの正規表現にマッチしたグループの1つ目という意味合い。
RewriteRuleで評価されるのはアクセスURLのドメインより後ろの部分です(先頭の/は付きません。多分。)なので、この例ではアクセスしてきたファイルパス部分が「$1」に代入されます。
つまり、この設定ではアクセスしてきたドメインにwwwが含まれる場合はドメインからwwwを取り除いてリダイレクトする。ということになります。
巷のサンプルではよくRewriteCondやRewriteRuleにドメインをハードコードしている例が見受けられますが、毎回書き換えるのはめんどくさいしエラーの原因にもなりかねないので、汎用的に使える上記の記述のほうがいいのでは無いかと思います。
上記の例をふまえて、逆にwwwありのアクセスに統一する汎用的な設定方法は以下になります。
# wwwありアクセスを強制
RewriteCond %{HTTP_HOST} !^www\.
RewriteRule ^(.*)$ https://www.%{HTTP_HOST}/$1 [R=301,L]
この例では、RewriteCondでwwwが含まれない場合を条件としています。
そして、RewriteRuleではすべてのリクエストに対して、アクセスしてきたドメイン名「%HTTP_HOST」の前に「www.」を付与したURLでリダイレクトを指示しています。
こちらの例でもドメイン名は変数に依存してハードコードしていないので汎用的に使えますね。
レンタルサーバなどではサブドメインを追加した際に、メインドメインのドキュメントルート直下にサブドメイン名のディレクトリが作成され、そこがサブドメインのドキュメントルートになる場合があります。
/example.com (example.comのドキュメントルート
└/sub(sub.example.comのドキュメントルート
実はこれ、「https://example.com/sub/」でも「sub.example.com」のドキュメントルートへアクセスできてしまいます。問題ない場合もあるでしょうが、大概の場合において問題があるでしょう。この場合、サブドメインのドキュメントルートにhtaccessを設定することでサブドメインアクセスに強制することができます。
# サブドメインアクセスを強制
RewriteCond %{HTTP_HOST} !^sub\.
RewriteRule ^(.*)$ https://sub.%{HTTP_HOST}/$1 [R=301,L]
これ、wwwありアクセスの強制と仕組みはおんなじです。
「https://example.com/sub/」へのアクセスはURLの先頭に「sub」がついていないので、「sub」をつけてリダイレクトする。という意味になります。
最近ではレンタルサーバでも無料の独自SSLが利用でき、SEOの観点などからもHTTPSでのアクセスを必要とするケースが増えてきました。入力フォームなどを利用するサイトでは特にHTTPSでのアクセスは必須ですね。
# HTTPSを強制(HTTPの場合はリダイレクト)
RewriteCond %{HTTPS} off
RewriteRule ^(.*)$ https://%{HTTP_HOST}%{REQUEST_URI} [R=301,L]
RewriteCondでHTTPSでのアクセスがoffの場合、HTTPSでのアクセスに書き換えてリダイレクトしています。
RewriteCond %{TIME} >20210318123456
RewriteRule ^test\.html$ /test_v02.html [R=302,L]
「%{TIME}」はサーバのタイムスタンプです。年月日時分秒になっています。
不等号記号を用いて、指定の日時を超えたとき、指定の日時を超える前などの条件を設定できます。
上記例では指定日時を超えた場合にリダイレクトする設定になっています。
この設定から更に踏み込んで、同一URLでも指定日時を境目に出力する内容を変更することもできます。
RewriteCond %{TIME} >20210318123456
RewriteRule ^test\.html$ /test_v02.html [L]
リダイレクトではなく、内部的な参照を置き換えただけです。表示上のURLは「test.html」のまま、「test_v02.html」の内容を表示することができます。CMSなどを設置している場合は日時指定でのページ切り替えは容易ですが、そうでない場合などに活用できます。
また、HTMLファイルだけでなく、画像やPDFなどへのアクセスにも適用できるため、例えば来月から利用規約のPDFが変更されます。などの場合に、事前にサーバに新しい規約のPDFファイルを仕込んでおいて、指定の日時になったら自動的に切り替わる。なんてこともできます。
RewriteCondの右辺、不等号の後ろに空白は入らないの要注意。