もうすぐ年度末ですね。
年度末が近づくとサイトのリニューアルやサーバーの引っ越しがとても多いと思います。
Web屋で働いていたいましたが年度末はいつも鉄火場でした。
リニューアルとかすると↓みたいなこと言われていました。
- メンテナンス中は訪問者をメンテページに飛ばす!
- 新しいサイトは常時HTTPSで運用する!
- URLは絶対にwwwありにする!
これらの多くのことはリダイレクト設定を行うことで可能ですが、
普段からサーバーに触れていないとなかなか難しく感じるものと思います。
サーバー管理者をしていて、結構使うなーと感じた設定のサンプルを紹介しますね。
設定の前提条件
- Apache HTTP Server を想定しています。
- が、IISのISAPI_Rewrite でも通用するはず。
- 設定を記述するファイルはドキュメントルート直下の.htaccessファイルとします。
- セキュリティ的にどない?という感じですが、レンタルサーバーなどではApacheの設定ファイル触れないからね、仕方ないね。
- 以下の記述はすでに書かれているものとします。
RewriteEngine On
RewriteBase /
特定IPアドレス以外からの接続はメンテナンスページに飛ばしたい
サーバーのメンテナンスを行う場合などによく使いますね。
- 特定のIPアドレス以外の全ての接続をメンテナンスページにリダイレクトする
RewriteRule ^/maintenance.html - [L]
# ここで明示したIP以外からの接続はメンテナンスページへ
RewriteCond %{REMOTE_ADDR} !^(192.168.200.1)$
RewriteRule ^(.*)$ http://hogehoge.net/maintenance.html [R=503,L]
この例で、R=503 はリダイレクトの際に503のステータスコードを返すことを意味しています。
この例ではメンテナンスページに飛ばすので、503のステータスコードを返すようにしています。
- 一部のコンテンツは閲覧を許可し、それ以外はメンテナンスページにリダイレクトする
## 閲覧OKなものを先に許可
RewriteRule ^maintenance/index.html - [L]
RewriteRule ^images/ - [L]
RewriteRule ^guide/ - [L]
RewriteRule ^common/ - [L]
# アクセスを許可するIPアドレス
RewriteCond %{REMOTE_ADDR} ^(192.168.200.1|172.16.200.1|10.0.200.1)$
RewriteRule (.*) - [R=503,L]
# 残りすべてのアクセスをメンテナンス画面HTMLに向ける
RewriteRule (.*) /maintenance/index.html [R=503,L]
アクセスを許可するIPアドレスの指定の部分で、
^(192.168.200.1|172.16.200.1|10.0.200.1-)$ と記載しています。
丸括弧『()』で囲み、パイプ『|』でIPアドレスを区切るとORの条件で判定されます。
この記述は以下のように書き換えることができます。
RewriteCond %{REMOTE_ADDR} ^(192.168.200.1)$ [OR]
RewriteCond %{REMOTE_ADDR} ^(172.16.200.1)$ [OR]
RewriteCond %{REMOTE_ADDR} ^(10.0.200.1)$
[OR]を付けないとANDの条件になってしまうので気をつけましょう。
URLをwwwありに統一したい
URLを『wwwあり』または『wwwなし』に統一することを『正規化』といいます。
RewriteEngine on
RewriteCond %{HTTP_HOST} ^hogehoge.com
RewriteRule ^(.*)$ http://www.hogehoge.com/$1 [R=301,L]
URLをwwwなしに統一したい
上の例とは真逆のことをします。
RewriteEngine on
RewriteCond %{HTTP_HOST} ^www.hogehoge.com
RewriteRule ^(.*)$ http://hogehoge.com/$1 [R=301,L]
必ずHTTPSで接続させたい
RewriteCond %{HTTPS} off
RewriteRule ^(.*)$ https://%{HTTP_HOST}%{REQUEST_URI} [R=301,L]
この例はHTTPで接続がきた場合、HTTPSへリダイレクトします。
下記の様に記述することもできますが、ロードバランサーを使用している場合、
ロードバランサーとWebサーバーの間で80番ポート以外のポートで
情報のやりとりをしている場合、意味を成さない設定となってしまいます。
RewriteCond %{SERVER_PORT} 80
RewriteRule ^(.*)$ https://%{HTTP_HOST}%{REQUEST_URI} [R=301,L]
必ずHTTPで接続させたい
上記とは逆の設定ですね。
RewriteCond %{HTTPS} on
RewriteRule ^(.*)$ https://%{HTTP_HOST}%{REQUEST_URI} [R=301,L]
または
RewriteCond %{SERVER_PORT} 443
RewriteRule ^(.*)$ http://%{HTTP_HOST}%{REQUEST_URI} [R=301,L]
SEO的にはHTTPSのページがいいという話を聞くので、この設定をすることは少なそうですね。
スマホ・ガラケーは専用ページに飛ばす
- ガラケー用の設定
- 前提条件としてガラケー用ページは /mb 以下にあるものとする
RewriteCond %{HTTP_USER_AGENT} (DoCoMo|J-PHONE|Vodafone|SoftBank|UP.Browser) [NC]
RewriteRule ^(.*)$ /mb/$1 [R=302,L]
- スマホ用の設定
- 前提条件としてスマホ用ページは /sp 以下にあるものとする
RewriteCond %{HTTP_USER_AGENT} (iPhone|iPod|BlackBerry|Windows Phone|Android.+Mobile) [NC]
RewriteCond %{HTTP_USER_AGENT} !iPad [NC]
RewriteRule ^(.*)$ /sp/maintenance.html [R=302,L]
上記の例ではiPadでの接続はPCページを見られる設定になっています。
モバイルサイトへのリダイレクトは302を返すようにしています。
どうやら301よりも302の方がいい模様です。
Google、モバイル向けサイトのリダイレクトには301よりも302を使うように推奨を変更|海外SEO情報ブログ
ページが存在しない場合に404ページに飛ばす
RewriteCond %{REQUEST_FILENAME} !-f [OR]
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^.*$ /404.html [R=404,L]
404ページなので、404のステータスコードを返すようにしています。
Rewriteの設定とは関係ありませんが、Google AdSense を使っている場合
404ページに広告があると規約違反となります。
最悪の場合AdSenseが使えなくなるそうなのでお気をつけください。
404リダイレクトは下記の方法でも実現可能です。(mod_rewriteでは無いですが;)
ErrorDocument 404 /404.html