我已经configurationNginx使用srcache(以及redis和redis2模块)。 服务器端caching很好。 我的应用程序响应相应的Expires和Cache-Control标题,srcache将相应地存储和从Rediscaching中获取。
我希望我的回应可以被我的服务器之外的浏览器和代理caching。 Expires和Cache-Control标题被发送。 但是, Cache-Control max-age不会自动更新。 我认为这是因为这个头实际上存储在caching中。 注意这些响应的date,并且Cache-Control头中的max-age仍然是2592000 …初始值。
HTTP/1.1 200 OK Server: nginx/1.2.9 Date: Tue, 01 Jul 2014 15:18:19 GMT Content-Type: application/javascript Content-Length: 2710 Connection: keep-alive Vary: Accept-Encoding Expires: Thu, 31 Jul 2014 15:13:00 GMT Cache-Control: public, max-age=2592000, must-revalidate, proxy-revalidate X-SRCache-Key: fde32bfe93fcf90c398e9ed585991146 X-SRCache-Fetch-Status: HIT X-SRCache-Store-Status: BYPASS HTTP/1.1 200 OK Server: nginx/1.2.9 Date: Tue, 01 Jul 2014 15:22:13 GMT Content-Type: application/javascript Content-Length: 2710 Connection: keep-alive Vary: Accept-Encoding Expires: Thu, 31 Jul 2014 15:13:00 GMT Cache-Control: public, max-age=2592000, must-revalidate, proxy-revalidate X-SRCache-Key: fde32bfe93fcf90c398e9ed585991146 X-SRCache-Fetch-Status: HIT X-SRCache-Store-Status: BYPASS
有什么方法可以纠正这个问题吗? 这里是我的Nginxconfiguration的相关部分:
location / { # Caching keys set_md5 $srcache_key $request_uri; srcache_ignore_content_encoding on; srcache_methods GET; srcache_fetch GET /redisFetch $srcache_key; srcache_store PUT /redisStore key=$srcache_key&exptime=$srcache_expire; add_header X-SRCache-Key $srcache_key; add_header X-SRCache-Fetch-Status $srcache_fetch_status; add_header X-SRCache-Store-Status $srcache_store_status; add_header X-SRCache-Expire $srcache_expire; include /apps/*/nginx/api.conf; } location = /redisFetch { internal; set $redis_key $args; redis_pass redis_cache; } location = /redisStore { internal; redis2_query set $arg_key $echo_request_body; redis2_query expire $arg_key $arg_exptime; redis2_pass redis_cache; }
最大年龄值指定对象应该被重新调整为新鲜的秒数。 也就是说,它可以被caching,包括通过浏览器这么多秒,所以你可能并不需要做任何事情来caching控制:max-age如果启用caching是你的目标。 更多的担心是你的Pragma:no-cache头。 同样在你的Cache-Control头中,你指定了must-revalidate。 这意味着客户端通常仍然需要发出请求,但是请求中将包含一个If-Modified-Since头,服务器可以发送一个304响应,而不必重新发送内容。 你应该考虑这是否是你真正想要的行为。
下面是对各种caching头文件的一个体面的解释,或者你可以去RFC的权威单词,更多正式语言[ http://www.w3.org/Protocols/rfc2616/rfc2616-sec14.html%5D
通常几乎不需要“更新”最大年龄值,除非事先知道下一版本的内容将在服务器端生成,而对于CC:max-age使用固定值则要less得多生成标题比每次做date计算。
Cache-Control头优先于理解Cache-Control(大部分甚至声称是HTTP / 1.0)的客户端的Expires头。
如果您的Expires标题正确生成,并且最大年龄值不是您想要的,那么您最简单的解决scheme可能是抑制CC: max age而不是纠正它。 ( http://wiki.nginx.org/HttpHeadersMoreModule )