10
6

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

ELBがかんでて.htaccessでのリダイレクトがうまく機能しなかったときの対応

Last updated at Posted at 2016-01-16

.htaccessのリダイレクトが上手くいかない

先日あるECサイトをリリースするに当たって、メンテナンス画面を表示するように.htaccessファイルでリダイレクトの設定をしていたのだが、なぜかメンテナンス画面は表示されず、真っ白な画面が表示されてしまった。

VM上のデモ環境やお客さんの検証環境でも問題なくリダイレクトされていたので、
当時は( ゚д゚)ポカーン となったw

実際の記述内容

リダイレクト処理を記述した.htaccessをさらす。

.htaccess
# カスタマイズしたメンテナンス画面のURL
ErrorDocument 503 /maintenance.html

# リライトルール
RewriteEngine On

# メンテナンス画面リダイレクト処理
RewriteCond %{REQUEST_URI} !^/maintenance.html
RewriteCond %{REMOTE_ADDR} !^××.××.××.××
RewriteRule ^(.*)$ [L,R=503]

やってることは、指定のグローバルIP以外からのアクセス、かつhttp://ドメイン/maintenance.htmlじゃなければメンテナンス画面にリダイレクト。
これで大丈夫と思っていたのだが、結果は画面が真っ白…

※ちなみにR=503なのは、Google先生に覚えられてしまうのを避けるためです。

原因と対応方法

なんかエラー出てんのかなーと思い、ログを確認してみたところ、ELBのheathcheckさえもリダイレクトしてしまっているので、ELBからすれば「あ、コイツ死んでるな。」と判断されてしまい、通信が終了してしまっていた模様。
対応方法は、以下の一行を追加したらOKだった。

追記内容
RewriteCond %{REQUEST_URI} !^/healthcheck.html

healthcheckは通さないとねー。

しかし、今度は指定のグローバルIPでもメンテナンス画面が表示されてしまう問題が発生。
これはちょっと見たらすぐに分かることだが、ELBからサーバーへの通信では、そのままではIPが取得できないのでX-Forwarded-Forで記述する必要がある。

変更点
RewriteCond %{REMOTE_ADDR} !^××.××.××.××

RewriteCond %{HTTP:X-Forwarded-For} !^××.××.××.××

はい。これで問題なく、指定のグローバルIPではサイトが見れた。

まとめ

LBの設定とかLBからの通信など、インフラ周りはまだまだ勉強不足なため度々こける。ちゃんと勉強しよう。また、リダイレクト処理を書くための正規表現の勉強する必要があるな。

10
6
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
10
6

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?