1

我正在从(希望)无 cookie 域提供静态文件(图像、javascript、css 文件),该域也映射到我的 cloudcontrol 部署。这是请求和响应标头。我在请求中没有看到 cookie 标头,ETag 和日期检查应该满足,所以我希望 cloudcontrol 部署前面的清漆代理会获取请求并提供服务,但每次我尝试它时,所有静态文件都是从Apache 根据响应标头进行处理。任何小费表示赞赏。

Request URL:http://static.hotelpress.mobi/bundles/viermediamagazine/icons/social/Facebook_64.png
Request Method:GET
Status Code:304 Not Modified

请求标头

Accept:*/*
Accept-Charset:ISO-8859-1,utf-8;q=0.7,*;q=0.3
Accept-Encoding:gzip,deflate,sdch
Accept-Language:de-DE,de;q=0.8,en-US;q=0.6,en;q=0.4
Cache-Control:max-age=0
Connection:keep-alive
Host:static.hotelpress.mobi
If-Modified-Since:Sat, 20 Apr 2013 18:23:31 GMT
If-None-Match:"6008d436-1108-4daceeec74ec0"
Referer:---stripped out or my boss kills me---
User-Agent:Mozilla/5.0 (Macintosh; Intel Mac OS X 10_7_4) AppleWebKit/537.31 (KHTML, like Gecko) Chrome/26.0.1410.65 Safari/537.31

响应标头

Accept-Ranges:bytes
Age:0
Connection:keep-alive
Date:Sat, 20 Apr 2013 18:31:33 GMT
ETag:"6008d436-1108-4daceeec74ec0"
Last-Modified:Sat, 20 Apr 2013 18:23:31 GMT
Server:Apache
Via:1.1 varnish
X-Varnish:995972028
X-varnish-cache:MISS
4

3 回答 3

2

假设 Varnish 正在通过所有 Apache 标头,您似乎没有设置任何标头告诉 Varnish 进行缓存。

Varnish 默认情况下会静默缓存 2 分钟,没有标题,但您可能想要更多。

出于您所说的原因,您还应该删除 Etag。关于 Etags 的更多信息在这里

如果您有指纹资产(每次部署/更改),您应该在 Apache 中设置 1 年。

只要你能站起来,任何其他人都可以(请记住,这可能会阻止你经常更新这些资产,因为它们可能被缓存在某个地方)。

以下是您在 apache 中需要的行:

<LocationMatch "^/path/to/fingerprinted/assets/.*$">
    Header unset ETag
    FileETag None
    # RFC says only cache for 1 year
    ExpiresActive On
    ExpiresDefault "access plus 1 year"
    Header append Cache-Control "public"
</LocationMatch>

对于其他人:

<LocationMatch "^/bundles/viermediamagazine/icons/.*$">
    Header unset ETag
    FileETag None
    ExpiresActive On
    ExpiresDefault "access plus 1 week"
    Header append Cache-Control "public"
</LocationMatch>

您可以使用任意数量的位置 - 只需确保它们不重叠!

于 2013-04-21T20:24:44.393 回答
1

您发布的示例请求包含

Cache-Control:max-age=0

这可以防止缓存的答案iirc。Cache-Control: max-age=<x>如果在响应中设置标题有帮助,您也可以尝试。

于 2013-04-20T20:29:28.533 回答
0

扩展其他答案:这是对 cloudControl 上的应用程序的示例请求,它缓存(当 ?c=1 时)。在任何情况下,多次发送请求,直到你得到一致的命中,以确保所有 Varnish 实例都缓存了响应。

$ curl -v http://impresstw.cloudcontrolled.com/?c=1
* About to connect() to impresstw.cloudcontrolled.com port 80 (#0)
*   Trying 46.137.184.215...
* connected
* Connected to impresstw.cloudcontrolled.com (46.137.184.215) port 80 (#0)
> GET /?c=1 HTTP/1.1
> User-Agent: curl/7.27.0
> Host: impresstw.cloudcontrolled.com
> Accept: */*
> 
< HTTP/1.1 200 OK
< Content-Type: text/html; charset=UTF-8
< Server: TornadoServer/2.4.1
< Cache-Control: max-age=36000, must-revalidate
< Expires: Tue, 23 Apr 2013 20:18:12 GMT
< Content-Length: 13
< Accept-Ranges: bytes
< Date: Tue, 23 Apr 2013 10:18:28 GMT
< X-Varnish: 1434600184 1434599691
< Age: 16
< Via: 1.1 varnish
< Connection: keep-alive
< X-varnish-cache: HIT
< 
于 2013-04-23T11:11:38.613 回答