2013-01-15 105 views
3

我安裝了清漆,一切正常。清漆 - 如何緩存登錄用戶

但是,我需要緩存登錄用戶。這是我在我的VCL中所擁有的:

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

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

sub vcl_fetch { 
    unset beresp.http.Set-Cookie; 
    set beresp.ttl = 24h; 
    return(deliver); 
} 

上述工作,但用戶可以查看其他用戶的數據,例如假設我以Sam的身份登錄並訪問了頁面A.當另一個用戶Angie登錄並打開頁面A時,她看到的內容與Sam相同。

有沒有一種方法可以將頁面限制爲實際被授權查看該頁面的登錄用戶?

我的請求頭如下:

Request Headersview source 
Accept text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8 
Accept-Encoding gzip, deflate 
Accept-Language en-US,en;q=0.5 
Authorization Basic YWRtaW46YWRtaW4= 
Connection keep-alive 
Cookie tree-s="eJzTyCkw5NLIKTDiClZ3hANXW3WuAmOuRKCECUjWFEnWIyIdJGvGlQgEegAD3hAj"; __ac="0zVm7PLtpaeQUXtm9BeYrC5%2BzobmBLPQkjRtxjyRGHs1MGY1MTgzZGFkbWluIQ%3D%3D"; 'wc.cookiecredentials'="0241d135445f7ca0b1cb7aced45da4e750f5414dadmin!" 

我可以使用Authorization項的請求頭實施這一限制?

回答

3

你的VCL目前正在做的是從請求頭中刪除Cookie並緩存所有請求。這會導致您描述的確切行爲:第一頁加載被緩存,並且所有後續用戶都獲取緩存的內容 - 無論是誰發出請求。通常,您只想爲尚未登錄的用戶緩存內容。

您無法使用Varnish進行授權或訪問控制。這需要由後端處理。爲了做到這一點,您需要識別包含相關會話信息的cookie,並在定義會話時保留cookie,並在其他情況下放棄Cookie。

例如:

sub vcl_recv { 
    if(req.http.Cookie) { 
    # Care only about SESSION_COOKIE 
    if (req.http.Cookie !~ "SESSION_COOKIE") { 
     remove req.http.Cookie; 
    } 
    } 
} 

這種方式包含一個「會話cookie」曲奇所有請求都將通過到後端傳遞,而沒有登錄用戶光油接收緩存副本。

如果您希望使用Varnish進行緩存登錄用戶,我建議你看看Varnish's ESI features

+1

這樣做可以在網頁本身沒有任何修改,即esi標籤,只是通過VCL做到這一點? – Frankline

+0

對於ESI,您需要大幅改變頁面。就cookie而言,如果您的網頁只爲已登錄並在退出時(或會話過期)清除的用戶設置了Cookie,則可以在我的答案中使用VCL(根據您的需要進行修改),以便刪除多餘的Cookie。 – Ketola

0

它可以通過VCL只能做 - 與另外一個VMOD或內嵌C.

一個簡單的例子: 比方說,你有三個不同層次用戶的三個不同的網頁:(未登錄,登錄後,管理員),關卡存儲在cookie中。你可以把cookie值和一個GET參數添加到URL:

http://example.com/homepage.html?user_level=none

http://example.com/homepage.html?user_level=logged_in

http://example.com/homepage.html?user_level=admin

(你VMOD將處理中添加或 '&' 和 '?'名稱值對到URL的末尾)。

所有這一切通常會在vmod中完成,但也可以根據大小完成,如inli ne C. Vmods是首選,但內聯C可以讓你啓動並運行初始測試 - 然後移動到vmod。

當vcl_hash()運行時,它會散佈在剛剛修改的url上。現在,清漆緩存將包含最多三個不同版本的頁面。從Varnish的角度來看,這些是三種不同的緩存對象。您可以爲頁面的每個變體設置不同的TTL。

在高速緩存未命中時,後端Web服務器可以忽略剛添加的此獲取參數,也可以在vcl_hash()或vcl_backend_fetch中將其刪除。您的後端服務器通常會使用cookie值而不是此vcl添加的參數。

總之,您正在修改URL參數,以便爲您需要的不同用戶級別使用不同的哈希值。或者,你可以改變你的vcl_hash()方法來代替cookie值,但是我發現改變URL更好的varnishncsa日誌和報告。另外,如果cookie被加密,那麼只需修改URL參數,就可以使用基本cURL請求更輕鬆地處理PURGE請求。如果發送PURGE請求的客戶端是授權用戶,您的PURGE條件將會處理。