要望や症状
EC-CUBE 4系において、機能リリースなどのタイミングで一般のユーザーにはメンテナンスモードを表示させつつ、関係者だけサイト表示をさせたいというケースがあります。
理由や原因
.htaccessでIPアドレス制限を行う場合、RewriteRuleとErrorDocumentの適切な組み合わせが必要です。 正しい503ステータスコードの返却とメンテナンス画面の表示を両立させるには、RewriteRuleの記述方法に注意が必要です。
解決策
EC-CUBEのルートディレクトリにある.htaccessファイルを以下のように設定します。
基本的な設定方法
# メンテナンス用のIPアドレス制限
ErrorDocument 503 /maintenance.php
<IfModule mod_rewrite.c>
RewriteEngine On
# メンテナンス画面自体へのアクセスは除外
RewriteCond %{REQUEST_URI} !^/maintenance\.php$
# 許可するIPアドレス(実際のIPアドレスに置き換える)
RewriteCond %{REMOTE_ADDR} !^XXX\.XXX\.XXX\.XXX$
# 503ステータスを返してメンテナンス画面にリダイレクト
RewriteRule ^(.*)$ - [R=503,L]
</IfModule>
複数IPアドレスを許可する場合
ErrorDocument 503 /maintenance.php
<IfModule mod_rewrite.c>
RewriteEngine On
RewriteCond %{REQUEST_URI} !^/maintenance\.php$
RewriteCond %{REMOTE_ADDR} !^XXX\.XXX\.XXX\.XXX$
RewriteCond %{REMOTE_ADDR} !^YYY\.YYY\.YYY\.YYY$
RewriteRule ^(.*)$ - [R=503,L]
</IfModule>
環境変数を使用した代替案
ErrorDocument 503 /maintenance.php
<IfModule mod_rewrite.c>
RewriteEngine On
RewriteCond %{REQUEST_URI} !^/maintenance\.php$
RewriteCond %{REMOTE_ADDR} !^XXX\.XXX\.XXX\.XXX$
RewriteRule ^(.*)$ - [E=maintenance:1]
RewriteCond %{ENV:maintenance} ^1$
RewriteRule ^(.*)$ - [R=503,L]
</IfModule>
設定時の注意点
EC-CUBEの.htaccessを変更する前に必ずバックアップを取得してください。IPアドレスは環境に応じて適切に設定し、XXX.XXX.XXX.XXXの部分を実際のIPアドレスに置き換えます。
設定後は指定IP以外からのアクセステストを必ず実施してください。また、メンテナンス画面(maintenance.php)は事前に準備しておく必要があります。
この方法により、指定したIPアドレス以外からのすべてのアクセスに対して503ステータスコードとともにカスタムメンテナンス画面を表示できます。