Как я могу вернуть состояние 503 в apache, не вызывая внешние скрипты

26

Мне нужно вернуть код состояния 503 с одного из моих сайтов, пока он не обслуживается, проверенным временем способом SE_firendly. Кажется, я не могу понять, как это сделать, не вызывая внешние скрипты, которых я бы предпочел избегать.

Существует ли директива apache, которая позволит мне возвращать произвольный код состояния HTTP, не прибегая к таким хакам, как вызов php-скрипта, который устанавливает заголовок состояния?

Дэн Маккинлей
источник
2
Я не совсем уверен, что запуск файла PHP классифицируется как «взлом» ... это именно то, для чего предназначен веб-сервер ...
Марк Хендерсон
3
Гектометр Я думаю, что вызов всего интерпретируемого языка сценариев для установки одной строки ответа сервера действительно считается хаком. Настройка строк заголовков ответов без сложных обходных путей кажется мне ближе к тому, для чего предназначены веб-серверы.
Дэн Маккинлэй
Тот же вопрос в webmasters.stackexchange.com/questions/61241/...
rubo77

Ответы:

32

Это обслуживает каждый запрос статической удерживающей страницы вместе со статусом 503.

RedirectMatch 503 ^/(?!holding\.html)
ErrorDocument 503 /holding.html
Header always set Retry-After "18000"

RedirectMatch используется для отмены самой страницы удержания, которая в противном случае создала бы бесконечный цикл.

mod_header используется для установки заголовка Retry-After, чтобы вы могли сообщить Google / другим ботам и т. д., что в этом примере вы должны выполнить резервное копирование через 18000 секунд (5 часов). Вы можете sudo ap2enmod headerактивировать mod_header (который требуется для директивы Header).

muffinresearch
источник
2
+1: боковой комментарий: Вы можете добавить только правила [RedirectMatch 503. *] И [Заголовок всегда устанавливать Retry-After «18000»], и это работает с сообщением об ошибке 503 по умолчанию. Проверьте файл conf.d / localized-error-pages, чтобы установить другое сообщение для разных языков (для них требуется согласование, псевдоним и включаемые модули).
Лепе
Оно работает! Для моего личного сайта я использую RedirectMatch 503 ^/(?!\.Error/.*|dragonlord-bg\.jpg).
bwDraco
7

Пытаться

Redirect 503 / /

С http://httpd.apache.org/docs/2.2/mod/mod_alias.html#redirect :

Другие коды состояния можно вернуть, указав числовой код состояния в качестве значения состояния. Если статус находится между 300 и 399, аргумент URL должен присутствовать, иначе он должен быть опущен. Обратите внимание, что статус должен быть известен коду Apache (см. Функцию send_error_response в http_protocol.c).

Дополнительное примечание: при этом отобразится стандартное / настроенное ErrorDocument для ошибки 503.

Дэвид Пашли
источник
Спасибо, Дэвид. mod_alias - это не то место, где я ожидал найти этот ответ, но, похоже, он выполняет свою работу.
Дэн Маккинлэй
да, Redirect не совсем правильный глагол для того, что вы делаете :)
Дэвид Пашли
В перенаправлении 503 отсутствует один аргумент, URL-путь, который всегда является обязательным. URL с другой стороны должен быть пропущен, если перенаправленный код не
1
Я получаю сообщение об ошибке: «Перенаправление принимает два или три аргумента, необязательный статус, затем документ для перенаправления и целевой URL». Можете ли вы привести более полный пример в контексте?
Том
4
Redirect 503 /похоже на работу.
mpartel
0

Чтобы сделать режим обслуживания более гибким, установите 503, когда существует специальный файл, ala:

RewriteEngine on
RewriteCond %{DOCUMENT_ROOT}/.maintenance -f
RewriteRule .* - [R=503]

ПРИМЕЧАНИЕ. Расположение DOCUMENT_ROOT может отличаться в зависимости от httpd 2.2 и 2.4.

Таким образом, все, что вам нужно сделать, это «нажать /path/to/docroot/.maintenance», и ваш сайт немедленно начнет возвращать 503. Затем, чтобы все закончилось, создайте пользовательскую страницу с ошибкой в ​​формате HTML и добавьте ее в правильный файл конфигурации сервера Apache:

ProxyErrorOverride on
ErrorDocument 503 /error/503.html

А для бонусных баллов, если у вас есть несколько веб-серверов, либо укажите местоположение .maintenance в общей файловой системе, либо для еще большего количества бонусных баллов:

pdsh -w $web1_ip,$web2_ip,$web3_ip "sudo touch /path/to/docroot/.maintenance"

Преимущество создания файла режима обслуживания состоит в том, что он работает, когда ваше приложение не работает, он быстр и прост, а кеширующий прокси-сервер внешнего интерфейса легче обрабатывать, поскольку вы можете обрабатывать все серверные 503 одним махом.

Источники:

Фил
источник