Перезапись .htaccess работает, но перенаправление 503 не работает - PullRequest
1 голос
/ 07 августа 2020

Справочная информация

Мы, группа энтузиастов виски, выпускаем новый план бочек для виски (продукт) только один раз в неделю по средам в 19:00 по центральноевропейскому времени и с момента появления спроса на получение доли в контейнерах превышает доступность во много раз, сервер более или менее неистовствует в 19:00 по центральноевропейскому времени и, таким образом, может использовать все доступные ресурсы сервера.

Предпочтительное решение

Проанализировав логи за последние недели, я заметил, что многие из> 800 участников также одновременно активны на форуме во время выпуска нового плана (продукта). Поэтому, чтобы немного облегчить нагрузку на сервер, я хочу сделать форум временно недоступным с 1855 по 1915 CET, каждую среду.

Итак, я придумал следующий код для .htaccess, чтобы контролировать это:

RewriteEngine On
RewriteBase /
RewriteCond %{REQUEST_URI} ^/forum(/.*|$) [NC,OR]
RewriteCond %{REQUEST_URI} ^/timeline(/.*|$) [NC]
RewriteCond %{TIME_WDAY} =3
RewriteCond %{TIME_HOUR}%{TIME_MIN} >1654
RewriteCond %{TIME_HOUR}%{TIME_MIN} <1715
RewriteRule ^(.*)$ /503-Wednesday-1900CET.php [R=503,L]

Некоторые примечания:

  • Я также включаю /timeline/ страницы, на всякий случай, поскольку он использует немного более сложный запрос. Поэтому я хочу исключить возможность обновления кеша во время этого окна.
  • TIME_WDAY начинается с воскресенья в 0, чтобы просто передать это условие в среду =3.
  • Сервер настроен с часовым поясом UT C, поэтому мне нужно настроить смещение часового пояса, что приводит к >1654 и <1715 вместо >1854 и <1915.

Я могу проверить выше, без 3 RewriteCond %{TIME_ строк, успешно на https://htaccess.madewithlove.be/

Но когда я пробую его на своем сервере, с 3 RewriteCond %{TIME_ строками отключено, это приводит к сообщению с сервера 503 , но на самом деле он не переписывает URL-адрес в файл /503-Wednesday-1900CET.php ...

Когда я пробую его на своем сервере, с 3 RewriteCond %{TIME_ строк включено , это приводит к сообщению 500 от сервера, а также фактически не перезаписывает URL-адрес в /503-Wednesday-1900CET.php файл ...

Мои вопросы

В чем может быть причина того, что файл /503-Wednesday-1900CET.php не обслуживается? Я подозреваю, что RewriteRule содержит что-то, что сервер не принимает, но я этого не вижу.

И в чем может быть причина того, что строки 3 RewriteCond %{TIME_ вместо этого приводят к сообщению об ошибке 500?

Я уже искал в Интернете и Stackoverflow, но, похоже, не нашел трюка, который помог бы мне продвинуться в этом. Так что на данный момент любые подсказки приветствуются.

1 Ответ

1 голос
/ 07 августа 2020

Я могу протестировать вышеуказанное, без 3 строк RewriteCond% {TIME_, успешно на https://htaccess.madewithlove.be/

Инструмент тестера MWL неверен. Когда вы указываете статус возврата за пределами диапазона 3xx, тогда строка подстановки игнорируется, и вместо этого предоставляется документ об ошибке для соответствующего кода состояния (или ответ сервера по умолчанию, если ErrorDocument не был явно определен) . Итак, вам нужно определить пользовательский ErrorDocument для статуса 503.

Не уверен, почему вы получите ошибку 500, поскольку в опубликованных вами директивах нет ничего плохого , кроме упомянутого выше.

Однако вы должны быть осторожны, чтобы сам документ с ошибкой не инициировал ответ 503, поскольку это привело бы к бесконечной ошибке l oop (500). Вы также должны быть осторожны, чтобы любые связанные ресурсы (изображения, CSS, и c.) Также не были заблокированы. (Хотя вы еще не дошли до обслуживания своего документа об ошибке).

Попробуйте вместо этого следующее:

RewriteEngine On

ErrorDocument 503 /503-Wednesday-1900CET.php

RewriteCond %{REQUEST_URI} ^/forum(/.*|$) [NC,OR]
RewriteCond %{REQUEST_URI} ^/timeline(/.*|$) [NC]
RewriteCond %{TIME_WDAY} =3
RewriteCond %{TIME_HOUR}%{TIME_MIN} >1654
RewriteCond %{TIME_HOUR}%{TIME_MIN} <1715
RewriteRule !^503 - [R=503]

Обратите внимание, что строка подстановки в Директива RewriteRule - это всего лишь один дефис (-), указывающий на отсутствие подстановки (она все равно игнорируется).

Шаблон !^503 гарантирует, что сам документ об ошибке не приведет к ответу 503 (по сути, бесконечный l oop, который приведет к ответу сервера по умолчанию с ошибкой с дополнительным сообщением типа «произошла ошибка 500 при попытке обслуживания ErrorDocument для обработки запроса».) Аналогичным образом вам потребуется убедитесь, что все связанные ресурсы также не попадают под это правило. Как правило, предпочтительнее иметь ответ 503 как basi c, насколько это возможно.

Вам не нужен флаг L при указании кода состояния за пределами диапазона 3xx.

Я удалил директиву RewriteBase /, поскольку она здесь не требуется. Однако, если у вас есть другие директивы, которые полагаются на это, то, очевидно, добавьте его обратно.

Строго говоря, ответ 503 также должен сопровождаться Retry-After заголовком ответа HTTP, содержащим время ожидаемого возврата службы. (Я предполагаю, что вы устанавливаете это в своем сценарии PHP.)

...