2

我们通过负载平衡的 Amazon AWS 环境为多个 Typo3 网站使用 Varnish 3.0.2 前端缓存。一切正常,但使用 POST 方法提交信息的联系表单无法按预期工作。我填写表格并按下提交,浏览器开始运行,但返回表格并保留我输入的信息。如果我在后端 PHP Web 服务器上做同样的事情,那么对于 Post 来说一切正常。所以我认为我的 default.vcl 存在一些问题。我希望这里有一些 Varnish 专家,他们可以帮助 Varnish 新手。

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);
}
4

3 回答 3

0

我之前遇到了一些问题return(pipe)。我的解决方案很简单。只需在相同的条件下进行一次输入,return(hit_for_pass)然后vcl_recv再进行一次输入。这不是一个很好的解决方案,但它确实工作正常。return(deliver)vcl_fetch

于 2012-12-20T10:39:26.580 回答
0

很多时候,您不再需要通过 php 来跟踪用户(例如在提交表单之后)。如果您不需要根据里面的数据做出反应,请尝试清除 PHPSESSID cookie。

if (req.http.Cookie ~ "PHPSESSID"){
          remove req.http.Cookie;
}

我是清漆新手,所以我仍在考虑任何负面影响

  • 注意是否使用基于会话的 ajax。
  • 基于 PHP 的跟踪可能会带来一些麻烦。
  • 更多的想法任何人?

(可能看起来离题,但我遇到了完全相同的情况并以这种方式解决了它。)

于 2014-12-15T23:37:10.277 回答
0

这篇文章很旧,但很金。这个版本还在使用。我有相同版本的清漆,当我做一个 POST 时我有 503。如果你有这个问题(昨天和今天): 注意:在 vcl_recv 里面如果 PUT/POST/DELETE 做一个返回(通过),如果你需要使缓存无效,做一个 ban() 首先尝试确定 503 是否由超时生成和

backend default{
    .host = "10.0.0.10";
    .port = "80";
    .connect_timeout = 300s;
    .first_byte_timeout = 300s;
    .between_bytes_timeout = 300s;
}

第二次尝试替换

return (pipe);

return (pass);

因为不好用。记住:varnishlog 是你最好的朋友。

于 2015-12-29T20:11:51.663 回答