The correct当服务器无法处理请求时,响应是503服务不可用 https://www.rfc-editor.org/rfc/rfc2616#section-10.5.4。当情况是暂时的(如您的情况)时,您可以设置Retry-After https://www.rfc-editor.org/rfc/rfc2616#section-14.37header 让客户端知道在重试之前应该等待多长时间。
但是,这不会强制浏览器再次执行请求 - 这是您需要在 javascript 中自行处理的事情。例如,以下是如何在 jquery 中执行重试 ajax POST 请求:
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 https://www.rfc-editor.org/rfc/rfc2616#page-65:
如果收到 307 状态代码来响应除 GET 或 HEAD 之外的请求,则用户代理不得自动重定向该请求,除非用户可以确认该请求。
虽然已知某些浏览器会忽略此要求,但这绝对是不正确的,并且不是您想要依赖的东西。
如果您没有使用 POST 请求,那么您几乎肯定应该使用 POST 请求。请记住,GET 请求不应该有任何副作用 https://www.rfc-editor.org/rfc/rfc2616#section-13.9,默认情况下响应将被缓存。从您的问题描述来看,听起来您的请求很可能正在做一些有副作用的事情。