2012-12-18 127 views
2

我們通過負載均衡的Amazon AWS環境爲多個Typo3網站使用Varnish 3.0.2前端緩存。一切工作正常,但通過Method POST提交信息的聯繫表單不能按預期工作。 我填寫表單並按提交,瀏覽器開始進行,但返回到表單並保存我推出的信息。如果我在後端PHP Webserver上也做同樣的事情,那麼Post對所有事情都可以正常工作。所以我認爲我的default.vcl有一些問題。我希望這裏有一些清漆專家,他們可以幫助清漆新手。Varnish 3.0.2 POST請求問題

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

回答

0

我之前有過return(pipe)的問題。我的解決方案很簡單。只需在vcl_recv中執行return(hit_for_pass),然後在vcl_fetch中執行return(deliver)。這不是一個漂亮的解決方案,但它確實工作正常。

0

很多時候,您不需要通過php(在提交表單後)進一步追蹤用戶。 嘗試清除PHPSESSID cookie,如果您不需要根據內部數據做出反應。

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

我是一個新手,以清漆,所以我還在想任何負面的副作用

  • 注意,如果使用基於會話的阿賈克斯。
  • 基於PHP的跟蹤可能會造成一些麻煩。
  • 更多創意人?

(似乎offtopic但我有完全相同的情況,解決這種方式。)

0

這個職位是舊的,但黃金。該版本仍在使用。 我有相同版本的清漆,當我做POST時,我有503。如果你有這個問題(昨天和今天): 注意:內部vcl_recv如果PUT/POST /通過暫停時以

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

第二個嘗試remplace

return (pipe); 

return (pass); 

因爲不產生工作得很好。記住:varnishlog是你最好的朋友。