インフラエンジニアbacchiのわかったことまとめ

bacchi.me

インフラエンジニアが選んだ頻出のリダイレクト設定7選

もうすぐ年度末ですね。

年度末が近づくとサイトのリニューアルやサーバーの引っ越しがとても多いと思います。

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
  • B!