.htaccessのリダイレクトが上手くいかない
先日あるECサイトをリリースするに当たって、メンテナンス画面を表示するように.htaccess
ファイルでリダイレクトの設定をしていたのだが、なぜかメンテナンス画面は表示されず、真っ白な画面が表示されてしまった。
VM上のデモ環境やお客さんの検証環境でも問題なくリダイレクトされていたので、
当時は( ゚д゚)ポカーン となったw
実際の記述内容
リダイレクト処理を記述した.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からの通信など、インフラ周りはまだまだ勉強不足なため度々こける。ちゃんと勉強しよう。また、リダイレクト処理を書くための正規表現の勉強する必要があるな。