Varnish 3.0.2 POST请求的问题
我们通过负载平衡的Amazon AWS环境为多个Typo3网站使用Varnish 3.0.2前端缓存。一切都很好,但是用Method POST提交信息的联系表单并没有按预期工作。 我填写表格并按submit,浏览器开始运行,但返回表格并保留我的推杆信息。如果我在后端PHP Web服务器上也这样做,那么这篇文章的一切都会很好。因此,我认为我的default.vcl存在一些问题。我希望这里有一些清漆专家,他们可以帮助清漆新手Varnish 3.0.2 POST请求的问题,post,request,submit,varnish,Post,Request,Submit,Varnish,我们通过负载平衡的Amazon AWS环境为多个Typo3网站使用Varnish 3.0.2前端缓存。一切都很好,但是用Method POST提交信息的联系表单并没有按预期工作。 我填写表格并按submit,浏览器开始运行,但返回表格并保留我的推杆信息。如果我在后端PHP Web服务器上也这样做,那么这篇文章的一切都会很好。因此,我认为我的default.vcl存在一些问题。我希望这里有一些清漆专家,他们可以帮助清漆新手 backend default{ .host = "10.0.0.
backend default{
.host = "10.0.0.10";
.port = "80";
}
acl ClearCache {
"localhost";
"10.0.0.10";
"10.0.0.96";
}
#acl purge {
# "localhost";
# "10.0.0.96";
#}
sub vcl_recv {
if (req.http.x-forwarded-for) {
set req.http.X-Forwarded-For =
req.http.X-Forwarded-For + ", " + client.ip;
} else {
set req.http.X-Forwarded-For = client.ip;
}
set req.backend = default;
if (req.request == "POST") {
ban("req.url == " + req.url);
set req.http.X-Test = req.url;
return (pass);
}
if (req.request == "BAN") {
if (!client.ip ~ ClearCache) {
error 405 "Not allowed.";
}
# This option is to clear any cached object containing the req.url
ban("req.url ~ "+req.url);
# This option is to clear any cached object matches the exact req.url
# ban("req.url == "+req.url);
# This option is to clear any cached object containing the req.url
# AND matching the hostname.
# ban("req.url ~ "+req.url+" && req.http.host == "+req.http.host);
error 200 "Cached Cleared Successfully.";
}
if (req.request != "GET" &&
req.request != "HEAD" &&
req.request != "PUT" &&
req.request != "POST" &&
req.request != "TRACE" &&
req.request != "OPTIONS" &&
req.request != "DELETE") {
return (pipe);
}
if (req.request != "GET" && req.request != "HEAD") {
return (pass);
}
if (req.http.Authorization || req.http.Cookie) {
return (pass);
}
if(req.http.host ~ "typo3.lygie.de"){
##TYPO3-Backend nicht cachen
if (req.http.cookie ~ "be_typo_user"){
##Inhalten löschen wenn Shift+reload gedrückt wird, aber nur bei eingeloggtem user (Backend-Cookie)
if (req.http.Cache-Control ~ "no-cache") {
set req.ttl = 0s;
ban("req.url == " + req.url);
return (pass);
}
}
else{
##Cookies von TYPO3-Seiten löschen
unset req.http.Cookie;
}
}
return (lookup);
}
sub vcl_fetch {
set beresp.ttl = 12h;
set req.grace = 24h;
if (req.url ~ "\.(jpeg|jpg|png|gif|ico|swf|js|css|txt|gz|zip|rar|bz2|tgz|tbz|html|htm|pdf|pls|torrent)$") {
set beresp.ttl = 48h;
}
if (req.url ~ "/typo3") {
}else {
unset beresp.http.set-cookie;
}
return (deliver);
}
我以前在
返回(管道)
方面遇到一些问题。我的解决办法很简单。在相同条件下,只需在vcl\u recv
中执行return(hit_for_pass)
,然后在vcl\u fetch
中执行return(deliver)
。这不是一个很好的解决方案,但它确实工作得很好。通常您不需要通过php(例如提交表单后)进一步跟踪用户。
如果不需要根据内部数据做出反应,请尝试清除PHPSESSID cookie
if (req.http.Cookie ~ "PHPSESSID"){
remove req.http.Cookie;
}
我是一个新手,所以我仍然在考虑任何负面的副作用
- 如果使用基于会话的ajax,请注意
- 基于PHP的跟踪可能会带来一些麻烦
- 还有其他想法吗
(可能看起来有些离题,但我遇到了完全相同的情况,并通过这种方式解决了问题。)这篇文章很古老,但很有价值。这个版本仍然在使用。 我有相同版本的varnish,当我发布帖子时,我有503。 如果您有此问题(昨天和今天): 注意:在vcl_recv内部,如果PUT/POST/DELETE执行返回(pass),如果需要使缓存无效,执行ban() 首先尝试确定503是否由超时生成
backend default{
.host = "10.0.0.10";
.port = "80";
.connect_timeout = 300s;
.first_byte_timeout = 300s;
.between_bytes_timeout = 300s;
}
第二名
return (pipe);
与
因为我工作不好。
记住:varnishlog是你最好的朋友
return (pass);