代理傳遞給清漆未命中緩存

代理傳遞給清漆未命中緩存

在我的網站伺服器上,我有一個清漆實例,我想快取第三方託管網站(位於 blog.company.com/blog)。我有一個代理通行證,因為網站的其餘部分是在本地託管的,並且希望瀏覽器將其偽裝成我們網站的一部分(company.com/blog)

(/etc/httpd/conf.d/proxy.conf)ProxyTimeout 300

# Blog
ProxyPass /blog http://localhost:8000
ProxyPassReverse /blog http://localhost:8000

我將清漆後端指向 blog.sugarsync.com:

backend default {
  .host = "70.40.204.127";
  .port = "80";
}

頁面解析,但頁面本質上被重定向到 blog.company.com/blog,並且它永遠不會命中快取...varnishlog 顯示一個「pass」函數,它接收 GET 請求,這意味著它不是哪個很奇怪,因為我在自訂後端之外的/etc/varnish/default.vcl 中使用所有預設行為,所以它不應該傳遞它們...

   11 SessionOpen  c 127.0.0.1 46485 0.0.0.0:8000
   11 ReqStart     c 127.0.0.1 46485 394102336
   11 RxRequest    c GET
   11 RxURL        c /
   11 RxProtocol   c HTTP/1.1
   11 RxHeader     c Host: localhost:8000
   11 RxHeader     c User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10_6_8) AppleWebKit/537.4 (KHTML, like Gecko) Chrome/22.0.1229.94 Safari/537.4
   11 RxHeader     c Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
   11 RxHeader     c Accept-Encoding: gzip,deflate,sdch
   11 RxHeader     c Accept-Language: en-US,en;q=0.8
   11 RxHeader     c Accept-Charset: ISO-8859-1,utf-8;q=0.7,*;q=0.3
   11 RxHeader     c Cookie: __utmx=74837904.GQgj_x3FQCSgKU8YgJ937g$30088162-10:0; __utmxx=74837904.GQgj_x3FQCSgKU8YgJ937g$30088162-10:1351630608:15552000; __utmx=32887036.GQgj_x3FQCSgKU8YgJ937g$30088162-10:0; __utmxx=32887036.GQgj_x3FQCSgKU8YgJ937g$30088162-10:1351791703:155
   11 RxHeader     c scns-hdr-ip: 50.76.54.11
   11 RxHeader     c X-Forwarded-For: 10.5.112.22
   11 RxHeader     c X-Forwarded-Host: www.s.company.com
   11 RxHeader     c X-Forwarded-Server: www.company.com
   11 RxHeader     c Connection: Keep-Alive
   11 VCL_call     c recv
   11 VCL_return   c pass
   11 VCL_call     c pass
   11 VCL_return   c pass

奇怪的是,當我直接輸入主機名稱(hostname.company.com:8000 或 company.com/blog)時,它會正確命中 varnish 緩存,但仍然會在瀏覽器中重定向 url。捲曲到正確的 URL (www.company.com/blog) 也會命中快取。子網域似乎也不起作用……這是怎麼回事?

答案1

發生這種情況的原因pass是因為預設的 VCL 邏輯拒絕快取請求標頭中帶有Authorization或 的任何內容,而您的請求有一個.CookieCookie

if (req.http.Authorization || req.http.Cookie) {
    /* Not cacheable by default */
    return (pass);
}

這種預設行為是出於非常謹慎的考慮,因此伺服器會為頁面傳回不同的內容以回應使用者的會話;您可以在您的vcl_recv.將您的實作作為預設值的副本,但去掉檢查req.http.Cookie

if (req.http.Authorization) {
    /* Not cacheable by default */
    return (pass);
}

就重定向行為而言,聽起來它正在收到30x回應,正在重定向客戶端瀏覽器 - 您能否提供其中一次點擊的日誌?

相關內容