Retry-after HTTP response header - это влияет на что-нибудь? - PullRequest
54 голосов
/ 22 сентября 2010

Если я хочу вежливо отказать в обслуживании на веб-сайте из-за временной перегрузки, ответ HTTP 503 Service Unavailable представляется подходящим.В спецификации упоминается отправка заголовка Retry-after с 503.

Есть ли смысл?Повлияет ли Retry-after на что-нибудь?Обращают ли на это внимание браузеры?

Ответы [ 4 ]

77 голосов
/ 26 мая 2014

Текущее состояние заголовка Retry-After

Реализация заголовка Retry-After на клиентах и ​​серверах несколько изменилась за последние годы с момента первоначальной публикации этого вопроса. Поэтому я решил дать обновленный ответ.

Прежде всего, RFC 2616, раздел 14.37 Повторная попытка состояния:

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

...

Два примера его использования:

  Retry-After: Fri, 31 Dec 1999 23:59:59 GMT
  Retry-After: 120

В последнем примере задержка составляет 2 минуты.

Поддержка клиентского и серверного программного обеспечения

Ниже приведены сообщения, объявления и документы о фиксации в хранилище кода, касающиеся заголовка Retry-After в различных программах.

хром / хром

Код коммит 22 ноября 2012 г. с сообщением журнала: Добавлены тайм-ауты обнаружения и использования HTTP-заголовка Retry-After .

Mozilla / Firefox

Фиксация кода 27 марта 2012 г. с сообщением журнала: Реализация обработки 5xxs, X-Weave-Backoff, Retry-After . Кроме того, в их хранилище Mercurial есть три других упоминания заголовка Retry-After .

Ошибка была первоначально отправлена ​​6 января 2004 года с заголовком Повтор после отправки с HTTP 503, ответ игнорируется .

Googlebot

В статье Центрального блога Google для веб-мастеров, посвященной простоям на сайте, упоминается, что заголовок Retry-After может использоваться для определения, когда нужно пересмотреть URL .

Bingbot / MSNbot

Не удалось найти официальный документ поддержки Retry-After. Тем не менее, было несколько упоминаний на случайных форумах об использовании этого заголовка в ответе 503 на дроссельные роботы Microsoft.

Nginx

Директива add_header гласит:

Добавляет указанное поле к заголовку ответа при условии, что код ответа равен 200, 201, 204, 206, 301, 302, 303, 304 или 307.

Поэтому, чтобы добавить заголовок Retry-After для ответа 503, используя версию:

  • 1.7.4 и более ранние версии, используйте сторонний модуль, например Заголовки Подробнее .

  • 1.7.5 и выше, добавьте параметр always к директиве add_header.

Apache

В отличие от Nginx, в документации заголовка Apache нет указаний на то, что он не может отправить заголовок Retry-After для ответа 503. Однако в отношении ответов, не относящихся к 2xx, документация гласит:

добавление заголовка к локально сгенерированному неуспешному (не 2xx) ответу, такому как перенаправление, в этом случае в окончательном ответе используется только таблица, соответствующая всегда.

Вот ответ SO , который устанавливает заголовок Retry-After с условием всегда для 503 ответов, как советует документ.

Статья AskApache предоставляет другие примеры конфигурации того, как дает указание поисковым системам возвращаться , используя ответ 503 с заголовком Retry-After.

Клиентское тестирование

Я написал сервер Ruby, который просто возвращает ответ 503 с заголовком Retry-After, установленным на 10 секунд, и телом, содержащим случайное число.

require 'sinatra'

get '/' do
  headers 'Content-Type' => 'text/plain', 'Retry-After' => '10'
  status 503
  body rand(1000).to_s
end

Я получил к нему доступ:

  • OpenBSD 5.8 с использованием Chromium 44, Firefox-ESR 38 и Seamonkey 2.33,
  • Mac OSX 10.7.5 с использованием Chrome 47 и Safari 6.1,
  • Windows 10 с использованием Chrome 48, Firefox 41 и Edge 25.

Я ожидал, что эти браузеры автоматически обновят URL-адрес через 10 секунд и отобразят новое случайное число.Тем не менее, все браузеры не повторили попытку даже через несколько минут.Я пробовал все более короткие и более длительные периоды Retry-After с теми же результатами.Журнал доступа к серверу подтвердил, что ни один из этих браузеров не делал повторных попыток.

Кроме того, «мягкое» обновление перед периодом повторных попыток немедленно обновило URL-адрес.Таким образом, заголовок Retry-After не может использоваться для ограничения «счастливых» пользователей.Я упоминаю об этом, потому что на каком-то форуме я увидел, что этот заголовок можно использовать для того, чтобы не дать нетерпеливым пользователям ударить по вашему сайту.

В качестве примечания, логично, что «мягкое» обновление не выполняет никаких действий дотайм-аут, но «жесткое» или обновление с обходом кэша будет игнорировать любой тайм-аут и немедленно перезапускать URL.кажется немного схематичным как на клиентах, так и на серверах.Тем не менее, неплохо установить время ожидания для 503 ответов, если его нетрудно настроить.

Даже если Googlebot - единственный клиент, поддерживающий заголовок и фактически повторяющий попытки после периода ожидания, он может сохранитьВаши страницы не будут проиндексированы - в отличие от ответа 404, 500, 502 или 504.

21 голосов
/ 22 сентября 2010

Насколько я знаю, ни один браузер не обращает внимания на заголовок Retry-after. Прокси и кеши могут, но

По-видимому, некоторые браузеры теперь поддерживают некоторый уровень поддержки Retry-After (хотя поддержка в лучшем случае сомнительна). Я не совсем убежден в преимуществах этого в браузере; как правило, считается плохой идеей кешировать сбои. Но если вы знаете, когда будете снова принимать запросы, сообщение клиенту не повредит. (Однако если вы вернетесь раньше, чем ожидалось, любая программа, которая на самом деле соблюдает заголовок, должна предположить и сообщить, что сайт все еще не работает.)

Самым очевидным преимуществом является то, что, похоже, робот Google (и, возможно, другие пауки) обратит внимание на заголовок, если он там есть, что может помешать ему некоторое время не индексировать страницу.

С учетом всего сказанного ... если добавить тривиально, и вы можете придумать достаточно точную оценку того, когда услуга будет доступна, сделайте это. Я бы не рекомендовал делать все возможное, чтобы сделать это. В любом случае, это только рекомендации, и неправильное время может вызвать больше проблем, чем вообще не включать заголовок.

8 голосов
/ 14 июня 2013

Я вижу это как проблему курицы и яйца: в настоящее время ни один браузер не реализует Retry-after, поскольку ни один веб-сайт не беспокоится об этом.На мой взгляд, идти вперед и отправить его в качестве услуги для пользователей.Если их выбор веб-браузера не реализует его, то это их браузер, просто не дающий им полезную информацию.Вы сделали!

При поиске стандартов, которые имеют несколько конкурирующих реализаций, я всегда стараюсь придерживаться стандартов и не обращать внимания на различные реализации (если я специально не пытаюсь эмулировать реализацию, такую ​​каксвернувшись, но замаскировав мои заголовки, чтобы они выглядели как веб-браузер).В противном случае мы получим стандарты де-факто, которые, если вы помните дни доминирования IE, вам не нужны!

3 голосов
/ 18 апреля 2015

Если вы хотите отправить автоматическое обновление через X раз, вы можете отправить

Refresh: 120; url=http://your_url.com

в PHP:

header("Refresh: "    .$retry_time."; url=". $url);

Чтобы обновить текущую страницу, вы можете использовать $_SERVER["REQUEST_URI"] для$ url.

Я успешно проверил этот заголовок в различных версиях Opera, Firefox и Internet Explorer.

Этот заголовок даже работает для обновления двоичного содержимого, например изображений (но только при прямой загрузке илив кадре - IMG-Tag не будет перезагружаться).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...