希望我正确理解了您的问题。我真的不明白 PHPSESSID 与处理 503 错误有何关系,但您根本不需要使用 cookie 来重试请求。
你可以在 Varnish 中使用重启来完成你想要做的事情。例如尝试请求 2 次,你可以这样做:
sub vcl_error {
if (obj.status == 503 && req.restarts < 2) {
return (restart);
}
}
这应该提供您正在寻找的功能,而无需接触 cookie。
这很明显,但我还是要说:你真正应该做的是找出导致 503 错误的原因。如果它们不是来自后端,则它们是由超时或 Varnish 配置问题引起的。密切注意您的 Varnish 日志中的“TxStatus c 503”行,看看请求发生了什么。
关于 503 错误的可能原因的更新:
显然,您在 POST 请求中收到 503 错误(即当用户尝试登录时)。如果帖子是通过慢速链接完成的,或者由于其他原因在 POST 正文完全传输之前客户端终止了连接,则可能会发生这种情况。但是,这不应该像no error recorded
在 varnishlog 中那样显示。在任何情况下,您可能都想试一试,看看它是否能解决您的问题。
Varnish 默认为 POST 请求返回(通过),但这并不是在所有情况下都按预期工作(有关更多信息,请参阅Varnish 票证 #849)。
我们选择管道所有 POST 请求并将 X-Forwarded-For 附加到请求中。这是相关的VCL:
# PIPE all POST requests
sub vcl_recv {
if (req.request == "POST") {
return (pipe);
}
}
# Set XFF for piped requests
sub vcl_pipe {
set bereq.http.Connection = "close";
set bereq.http.X-Forwarded-For = req.http.X-Forwarded-For;
if (bereq.http.x-forwarded-for) {
set bereq.http.X-Forwarded-For = bereq.http.X-Forwarded-For + ", " + client.ip;
} else {
set bereq.http.X-Forwarded-For = client.ip;
}
return (pipe);
}