Документация Apache 2.2 и Apache 2.4 для mod_rewrite четко гласит, что следует избегать правил перезаписи в директивах <Location>
. Это предупреждение не было включено в документацию Apache 2.0 .
Хотя правила перезаписи синтаксически разрешены в разделах <Location>
и <Files>
(включая их аналоги из регулярных выражений), это никогда не должно быть необходимым и не поддерживается. Вероятная особенность в этих контекстах - относительные замены.
Так могут происходить странные вещи. Вы можете удалить раздел <Location>
(и директиву RewriteBase
) и использовать эти новые правила перезаписи непосредственно в определении <VirtualHost>
, без раздела <Directory>
или <Location>
. Это даже быстрее.
Единственная проблема с правилами переписывания глобального уровня заключается в том, что у вас нет уже вычисленного REQUEST_FILENAME
(вы могли бы его немного взломать, но здесь вам даже не нужно REQUEST_FILENAME
).
У вас также есть одна ошибка в RewriteRule
, вы используете Redirect, поэтому правило перезаписи должно использовать абсолютный URL :
RewriteRule .* http://www.example.com/offline.html [R=302,L]
О странице обслуживания, классический способ работы с ней заключается в следующих двух строках:
ErrorDocument 503 /htdocs/err/503.html
RedirectMatch 503 ^/(?!err/)
Если вы не выполняете фильтрацию по локальному IP, но интересная часть заключается в том, что для обслуживания используется код 503 (временно недоступен), что является более правильным (на самом деле перенаправление 307 еще более корректно, но старый браузер может иметь проблемы с Это). Чтобы сделать то же самое с локальным ограничением IP и RewriteRule
, это будет:
ErrorDocument 503 /offline.html
RewriteCond %{REMOTE_HOST} !^127\.0\.0\.1
RewriteCond %{END:REDIRECT_STATUS} !=503
RewriteRule ^ - [L,R=503]