Ответ 1
Правильный ответ, когда сервер не может обработать запрос, 503 Service Unavailable. Когда условие является временным, как и в вашем случае, вы можете установить заголовок Retry-After
, чтобы клиент знал, как долго он должен ждать, прежде чем повторять попытку.
Однако это не заставит браузер повторить запрос - это то, что вам нужно будет обрабатывать в javascript. Например, вот как вы можете выполнить повторный запрос POJ запроса ajax в jquery:
function postData() {
$.ajax({
type: 'POST',
url: '503.php',
success: function() {
/*
Do whatever you need to do here when successful.
*/
},
statusCode: {
503: function(jqXHR) {
var retryAfter = jqXHR.getResponseHeader('Retry-After');
retryAfter = parseInt(retryAfter, 10);
if (!retryAfter) retryAfter = 5;
setTimeout(postData, retryAfter * 1000);
}
}
});
}
Обратите внимание, что приведенный выше код поддерживает только заголовок Retry-After
, где задержка повторения задается в секундах. Если вы хотите поддерживать даты, для которых потребуется немного больше работы. В производственном коде я также рекомендовал бы счетчик, чтобы убедиться, что вы не продолжаете повторять попытку навсегда.
Что касается использования кода состояния 307 для автоматического повторения запроса, я не думаю, что это хорошая идея. Даже если вы добавите параметр повтора, чтобы обойти обнаружение петли браузера (что кажется ужасным взломом), он все равно не будет работать над запросом POST. Из RFC2616:
Если код статуса 307 принимается в ответ на запрос, отличный от GET или HEAD, пользовательский агент НЕ ДОЛЖЕН автоматически перенаправлять запрос, если он не может быть подтвержден пользователем.
В то время как некоторые браузеры, как известно, игнорируют это требование, это определенно не правильно, и вы не хотите на него рассчитывать.
И если вы не используете запрос POST, вы почти наверняка должны быть. Помните, что запрос GET не должен иметь никаких побочных эффектов, и по умолчанию ответ будет кэшироваться. Из описания вашей проблемы это звучит очень похоже на то, что ваш запрос, вероятно, будет делать что-то, что имеет побочные эффекты.