Як я можу повернути статус 503 в apache, не посилаючись на зовнішні сценарії


26

Мені потрібно повернути код статусу 503 з одного з моїх сайтів, поки він не працює на технічне обслуговування, відповідно до SE_firendly. Я не можу зрозуміти, як це зробити, не посилаючись на зовнішні сценарії, яких я б краще уникнути.

Чи існує директива apache, яка дозволить мені повернути довільний код статусу HTTP, не вдаючись до хак, як-от виклик скрипта php, який встановлює заголовок статусу?


2
Я не зовсім впевнений, що запуск файлу PHP класифікується як "хак" ... це саме те, що призначений для веб-сервера ...
Марк Хендерсон

3
Гм. Я думаю, що виклик цілої інтерпретованої мови сценаріїв для встановлення єдиного рядка відповіді сервера кваліфікується як хак. Налаштування ліній заголовків відповідей без складних обхідних питань, мені здається, ближче до того, що веб-сервери були розроблені.
дан mackinlay

Те саме запитання на веб
майстрах.stackexchange.com/questions/61241/…

Відповіді:


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 (що потрібно для директиви заголовка).


2
+1: Побічний коментар: Ви можете лише додати [RedirectMatch 503. *] Та [Заголовка завжди встановлювати правила "Повторити після" 18000 "], і воно працює з повідомленням про помилку 503 за замовчуванням. Перевірте наявність файлу conf.d / localized-error-pages, щоб встановити інше повідомлення для різних мов (для них потрібні узгодження, псевдонім та включення модулів).
lepe

Це працює! Для особистого веб-сайту я використовую 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 - це не те, де я очікував знайти цю відповідь, але, здається, це зробить роботу.
дан mackinlay

так, перенаправлення насправді не є правильним дієсловом для того, що ти робиш :)
Девід Пашлі

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

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

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

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

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

Джерела:

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.