2011-02-23 112 views
2

我正在使用Varnish緩存第一次 並沒有任何喜悅讓它按我的意願工作。使用session_start()時varnish緩存不緩存PHP頁面

我的問題似乎很簡單。

所有我想要的.php頁面被緩存。

到目前爲止,每個.php請求總是會傳遞清漆 緩存並且會觸發我的apache Web服務器。

問題出在cookie和調用session_start();

沒有在session_start()=緩存 用在session_start()=沒有緩存

現在的文檔是很簡單的理解 ,但我已經嘗試和失敗嘗試。當我添加一個對session_start()=的調用=不需要更多緩存時,儘快 。

下面是示例HTML瓦特/ PHP:

<?php 
session_start(); 
?> 

<html> 
<head> 
</head> 
<body> 

<?php echo date('Y-m-d H-i-s'); ?> 

</body> 
</html> 

這是我非常乾淨和簡單的清漆default.vcl

backend default { 
    .host = "127.0.0.1"; 
    .port = "8080"; 
} 

sub vcl_recv { 
    unset req.http.Cookie; 
    return (lookup); 
} 

sub vcl_fetch { 
    if (beresp.http.Set-Cookie) { 
     unset beresp.http.Set-Cookie; 
     return (deliver); 
    } 
} 

這應該由客戶端和服務器 並取消設置的Cookie確實似乎這樣做。當螢火 在FireFox調試,我可以看到的Set-Cookie和Cookie的HTTP頭 是不是有當我使用這個default.vcl

下面是Firefox的HTTP頭:

響應頭:

HTTP/1.1 200 OK 
Server: Apache/2.2.16 (Debian) 
X-Powered-By: PHP/5.3.3-7 
Expires: Thu, 19 Nov 1981 08:52:00 GMT 
Cache-Control: no-store, no-cache, must-revalidate, post-check=0, pre-check=0 
Pragma: no-cache 
Vary: Accept-Encoding 
Content-Encoding: gzip 
Content-Type: text/html 
Content-Length: 192 
Date: Wed, 23 Feb 2011 01:34:17 GMT 
X-Varnish: 2052563421 
Age: 0 
Via: 1.1 varnish 
Connection: keep-alive 

Request Headers: 

GET /test.php HTTP/1.1 
Host: xshare.com.local 
User-Agent: Mozilla/5.0 (Windows; U; Windows NT 6.1; en-US; rv:1.9.2.13) Gecko/20101203 Firefox/3.6.13 
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8 
Accept-Language: en-us,en;q=0.5 
Accept-Encoding: gzip,deflate 
Accept-Charset: ISO-8859-1,utf-8;q=0.7,*;q=0.7 
Keep-Alive: 115 
Connection: keep-alive 
Cache-Control: max-age=0 

我只是不能看到我要去哪裏錯了。 我修了2個小時,在.vcl配置文件中添加/更改並刪除了 行和變體。

任何人都可以提供任何建議嗎?

很多謝謝。

回答

1

我發現了一個規則組合,現在是 緩存.php頁面,其中包含session_start()。

我已經留下,但已經註釋掉了一些 我已經試過了。

現在將試驗和錯誤歸結爲2條配置規則。

一個用於客戶端,另一個用於服務器。

Client = unset req.http.Cookie; 

Server = set beresp.ttl = 5d; 

backend default { 
    .host = "127.0.0.1"; 
    .port = "8080"; 
} 

sub vcl_recv { 
    unset req.http.Cookie; 
# unset req.http.Cache-Control; 
    return (lookup); 
} 

sub vcl_fetch { 
    if (beresp.http.Set-Cookie) { 
     set beresp.ttl = 5d; 
#   unset beresp.http.Set-Cookie; 
#   unset beresp.http.Expires; 
#   unset beresp.http.Cache-Control; 
     return (deliver); 
    } 
} 

乾杯。

+0

如果您不從beresp中去除set-cookies,您將爲所有用戶緩存相同的cookies! – matheuzzy 2016-03-30 07:18:04

+0

整個會議的重點是它對用戶來說是唯一的 - 這就是爲什麼清漆不會默認緩存它們, – matpol 2016-07-13 08:53:13

2

正如您現在可能已經發現的那樣,緩存和cookie不匹配。在上面的示例中,您將刪除會話Cookie(以及所有其他人),因此在以這種方式使用清漆時,您的會話將不可用。

2件事情可以做: - 允許Cookie,但沒有得到緩存登錄用戶 - 不使用一個會話(或餅乾),除非你真的要

第3更復雜的解決方案去除大多數頁面的Cookie,但允許它們處理一些頁面,然後將它們作爲ESI塊處理。有很多關於這方面的文檔。