19
votes

I'd like to implement mod_rewrite to put my site into maintenance. Basically all IP addresses except a handful we specify would be forwarded to a static html page.

Please can someone help with this rule. Also is there a way to turn this on and off easily without editing the htaccess file?

5
You may also want to serve your maintenance page with a 503 HTTP status code - Hagen von Eitzen

5 Answers

21
votes

You can use the REMOTE_ADDR variable in a RewriteCond

RewriteCond %{REMOTE_ADDR} !^10\.0\.1\.1$
RewriteRule ^ /maintenance.html

Just change the condition to match the IPs you want, for more than one you can use ^(ip1|ip2|...|ipn)$.

About how to disable the maintenance mode without changing the .htaccess file I think that's not possible short of writing a program that would delete it or otherwise modify it, an easy one would be to rename it.

8
votes

I'd like to slightly correct Vinko Vrsalovic's answer.

RewriteCond %{REMOTE_ADDR} !^10\.0\.1\.1$
RewriteRule ^ /maintenance.html

This rule result will be infinite loop and HTTP server error, because it will be executed on redirection page too. To make it work you should exclude redirection page from the rule. It can be done this way:

RewriteCond %{REMOTE_ADDR} !^10\.0\.1\.1$
RewriteCond %{REQUEST_URI} !/maintenance.html$ [NC]
RewriteRule .* /maintenance.html [R=302,L]
4
votes

Small improvement to Alexander's answer, it's not necessary to use regular expression for the IP address.

RewriteCond %{REMOTE_ADDR} !=10.0.0.1
RewriteCond %{REQUEST_URI} !/maintenance.html$ [NC]
RewriteRule .* /maintenance.html [R=302,L]
0
votes

you could enable this state and disable it via some admin interface that is able to write to .htaccess (e.g. permissions set to 755 or 777). it would just always find the .htaccess, insert those two lines at the beginning and on disabling maintenance it would delete those two lines, leaving the rest of the file untouched

0
votes

Optional redirect only specific addresses

Late to the party, and just an add-on if somebody needs it the other way around.
With this approach, you redirect only specific addresses into maintenance then play with the aliases.

ServerName  10.0.1.1
ServerAlias 10.0.2.1
ServerAlias 10.0.3.1

RewriteEngine On
RewriteRule ^(.*)$ http://www.domainname.com/maintenance.html$1 [L,R=301]