mod_cache如何处理“必须重新validation”和“最大年龄”?

在我将解释我的stream程之前的快速问题:mod_cache只有在max-age已过期的情况下才执行使用if-none-match的重新validation,以防其在逆向代理模式下configuration?

我的目标是减less一些重新validation请求到我们的原始服务器。

例如:第一个请求到达原始服务器,然后mod_cache根据头caching控制:max-age将响应保存到caching中。 只有当max-age过期时,mod_cache将使用if-none-match重新validation。

目前,无论是否定义了max-age,mod_cache都会重新validation每个请求。

我的configurationApache 2.4.3(Windows),在Linux上我看到了相同的行为,我将在下面显示。

    
    ServerName proxy.lo
    ProxyRequestclosures    
    ProxyPreserveHostclosures

   标题集“接受,内容types,内容编码,接受语言”

    RequestHeader设置X-Forwarded-Proto“http”

    #修改用户代理的标题
   标题集caching控制“私有,无caching,无存储,无变换”

    CacheQuickHandlerclosures

    CacheDefaultExpire 300

    #原始服务器不提供上次修改
    CacheIgnoreNoLastMod打开
    CacheIgnoreCacheControl On

    #原始服务器定义caching控制:私有,不存储用户代理
    #因此,我想忽略代理服务器上的这些头。
    CacheStorePrivate On
    CacheStoreNoStore打开

    CacheEnable磁盘/
    CacheRoot“C:/Apache.Cache” 
    CacheDirLevels 5
    CacheDirLength 4 

    CacheMinExpire 15

    CacheDetailHeader
    CacheHeader

   保持closures

    ProxyPass / http://origin.lo/
    ProxyPassReverse / http://origin.lo/

此外,我已经打开debugging日志级别,看看mod_cache如何处理caching的内容:我提供这个来显示mod_proxy总是决定一个内容不新鲜。 为什么?我提供这个来显示mod_proxy总是决定一个内容不新鲜。 为什么? 最大年龄提供(见下文)。

 [Sun Nov 04 11:58:42.899890 2012] [cache:debug] [pid 6492:tid 1400] cache_storage.c(624):[client 192.168.1.100:63741] AH00698:cache:实体/testing页密钥? )是http://proxy.lo/testpage?
 [Sun Nov 04 11:58:42.899890 2012] [cache_disk:debug] [pid 6492:tid 1400] mod_cache_disk.c(569):[client 192.168.1.100:63741] AH00709:调用的caching的URL信息头http:// proxy .LO / testpage?
 [Sun Nov 04 11:58:42.899890 2012] [cache_disk:debug] [pid 6492:tid 1400] mod_cache_disk.c(865):[client 192.168.1.100:63741] AH00720:调用URL http:// proxy的标头。 LO / testpage?
 [Sun Nov 04 11:58:42.899890 2012] [cache:debug] [pid 6492:tid 1400] cache_storage.c(320):[client 192.168.1.100:63741] AH00695:/ testpage的caching响应不新鲜。 添加/replace条件请求标头。
 [Sun Nov 04 11:58:42.899890 2012] [cache:debug] [pid 6492:tid 1400] mod_cache.c(414):[client 192.168.1.100:63741] AH00757:为/ testpage添加CACHE_SAVEfilter
 [Sun Nov 04 11:58:42.899890 2012] [cache:debug] [pid 6492:tid 1400] mod_cache.c(448):[client 192.168.1.100:63741] AH00759:为/ testpage添加CACHE_REMOVE_URLfilter
 [Sun Nov 04 11:58:42.899890 2012] [proxy:debug] [pid 6492:tid 1400] mod_proxy.c(1068):[client 192.168.1.100:63741] AH01143:正在运行的http处理程序(尝试0)
 [Sun Nov 04 11:58:42.899890 2012] [proxy:debug] [pid 6492:tid 1400] proxy_util.c(1976):AH00942:HTTP:已获取(origin.lo)
 [Sun Nov 04 11:58:42.899890 2012] [proxy:debug] [pid 6492:tid 1400] proxy_util.c(2029):[client 192.168.1.100:63741] AH00944:连接http://origin.lo/testpage来源:80
 [Sun Nov 04 11:58:42.901890 2012] [proxy:debug] [pid 6492:tid 1400] proxy_util.c(2151):[client 192.168.1.100:63741] AH00947:connected / testpage to origin.lo:80
 [Sun Nov 04 11:58:42.901890 2012] [proxy:debug] [pid 6492:tid 1400] proxy_util.c(2554):AH00962:HTTP:连接完成到192.168.1.100:80(origin.lo)
 [Sun Nov 04 11:58:42.903890 2012] [proxy:debug] [pid 6492:tid 1400] proxy_util.c(1991):AH00943:http:已发布连接(origin.lo)
 [Sun Nov 04 11:58:42.903890 2012] [headers:debug] [pid 6492:tid 1400] mod_headers.c(800):AH01502:headers:ap_headers_output_filter()
 [Sun Nov 04 11:58:42.903890 2012] [cache:debug] [pid 6492:tid 1400] mod_cache.c(1190):[client 192.168.1.100:63741] AH00769:cache:Caching url:/ testpage
 [Sun Nov 04 11:58:42.903890 2012] [cache:debug] [pid 6492:tid 1400] mod_cache.c(1196):[client 192.168.1.100:63741] AH00770:cache:删除CACHE_REMOVE_URLfilter。
 [Sun Nov 04 11:58:42.904890 2012] [cache_disk:debug] [pid 6492:tid 1400] mod_cache_disk.c(1318):[client 192.168.1.100:63741] AH00737:commit_entity:URL的标题和正文http:/ /proxy.lo/testpage? caching。

没有mod_proxy到http://origin.lo/的原始服务器的第一个请求

 GET http://origin.lo/testpage HTTP / 1.1
主持人:origin.lo
连接:保持活力
 User-Agent:Mozilla / 5.0(Windows NT 6.1; WOW64)AppleWebKit / 537.4(KHTML,如Gecko)Chrome / 22.0.1229.94 Safari / 537.4
接受:application / json
 Accept-Encoding:gzip,deflate,sdch
 Accept-Language:en-US,en; q = 0.8
 Accept-Charset:ISO-8859-1,utf-8; q = 0.7,*; q = 0.3

来自没有mod_proxy的原点的第一个响应

 HTTP / 1.1 200 OK
caching控制:必须重新validation,代理重新validation,最大年龄= 30
 Content-Type:application / json; 字符集= utf-8的
 ETag:“7cf651e2-176f-4ac1-808e-0e0c17cfd0a2”
服务器:Microsoft-IIS / 7.5
 X-AspNet-Version:4.0.30319
 X-Powered-By:ASP.NET
date:Sun,04 Nov 2012 10:11:01 GMT
内容长度:1877

所以,我认为只有在成功回应后的30秒内重新生效。 不是吗?

我们来看看:)

Google Chrome浏览器在30秒内没有执行任何请求来源服务器重新validation请求,并已从本地caching返回响应。

当max-age过期时,Google Chrome会执行重新validation的请求:

 GET http://origin.lo/testpage HTTP / 1.1
主持人:origin.lo
连接:保持活力
 Cache-Control:max-age = 0
 User-Agent:Mozilla / 5.0(Windows NT 6.1; WOW64)AppleWebKit / 537.4(KHTML,如Gecko)Chrome / 22.0.1229.94 Safari / 537.4
接受:application / xml
 If-None-Match:“7cf651e2-176f-4ac1-808e-0e0c17cfd0a2”
 Accept-Encoding:gzip,deflate,sdch
 Accept-Language:en-US,en; q = 0.8
 Accept-Charset:ISO-8859-1,utf-8; q = 0.7,*; q = 0.3

和回应:

 HTTP / 1.1 304未修改
caching控制:必须重新validation,代理重新validation,最大年龄= 30
 ETag:“7cf651e2-176f-4ac1-808e-0e0c17cfd0a2”
服务器:Microsoft-IIS / 7.5
 X-AspNet-Version:4.0.30319
 X-Powered-By:ASP.NET
date:2012年11月4日星期日10:16:20 GMT

正如你所看到的,所有的工作如预期的那样。 用户代理仅在max-age过期时重新validation请求。

现在让我们尝试通过mod_proxy执行follingstream程(参见上面的configuration)。

第一个要求:

 GET http://proxy.lo/testpage HTTP / 1.1
主持人:proxy.lo
连接:保持活力
 User-Agent:Mozilla / 5.0(Windows NT 6.1; WOW64)AppleWebKit / 537.4(KHTML,如Gecko)Chrome / 22.0.1229.94 Safari / 537.4
接受:application / json
 Accept-Encoding:gzip,deflate,sdch
 Accept-Language:en-US,en; q = 0.8
 Accept-Charset:ISO-8859-1,utf-8; q = 0.7,*; q = 0.3

答复是:

 HTTP / 1.1 200 OK
date:2012年11月4日星期日10:23:36 GMT
服务器:Apache
caching控制:私有,无caching,无存储,无变换
 Content-Type:application / json; 字符集= utf-8的
 ETag:“7cf651e2-176f-4ac1-808e-0e0c17cfd0a2”
内容长度:1932年
 Vary:Accept,Content-Type,Content-Encoding,Accept-Language
 X-Cache:来自proxy.lo的MISS
 X-Cache-Detail:来自proxy.lo的“cache miss:尝试实体保存”
连线:closures

好吧,让我们看看磁盘caching,并尝试查看请求和响应的存储方式。 (我削减二进制数据)

 HTTP://proxy.lo/testpage?
caching控制:私有,无caching,无存储,无变换
 Content-Type:application / json; 字符集= utf-8的
 ETag:“7cf651e2-176f-4ac1-808e-0e0c17cfd0a2”
date:2012年11月4日星期日10:27:15 GMT
内容长度:1932年
 Vary:Accept,Content-Type,Content-Encoding,Accept-Language

主持人:proxy.lo
 User-Agent:Mozilla / 5.0(Windows NT 6.1; WOW64)AppleWebKit / 537.4(KHTML,如Gecko)Chrome / 22.0.1229.94 Safari / 537.4
接受:application / json
 Accept-Encoding:gzip,deflate,sdch
 Accept-Language:en-US,en; q = 0.8
 Accept-Charset:ISO-8859-1,utf-8; q = 0.7,*; q = 0.3
 X-Forwarded-Proto:http
caching控制:max-age = 300,必须重新validation
 X-Forwarded-For:192.168.1.100
 X-Forwarded-Host:proxy.lo
 X-Forwarded-Server:origin.lo

好的,我们看到了什么? 我们看到第一个请求是用max-age = 300&must-revalidate来执行的

好吧,看起来不错,对我来说,让我们来进行下一个电话:

 GET http://proxy.lo/testpage HTTP / 1.1
主持人:proxy.lo
连接:保持活力
 User-Agent:Mozilla / 5.0(Windows NT 6.1; WOW64)AppleWebKit / 537.4(KHTML,如Gecko)Chrome / 22.0.1229.94 Safari / 537.4
接受:application / json
 Accept-Encoding:gzip,deflate,sdch
 Accept-Language:en-US,en; q = 0.8
 Accept-Charset:ISO-8859-1,utf-8; q = 0.7,*; q = 0.3

和来自mod_proxy的第二个响应:

 HTTP / 1.1 200 OK
date:2012年11月4日星期日10:31:58 GMT
服务器:Apache
caching控制:私有,无caching,无存储,无变换
 ETag:“7cf651e2-176f-4ac1-808e-0e0c17cfd0a2”
内容长度:1932年
 Vary:Accept,Content-Type,Content-Encoding,Accept-Language
 X-Cache:从proxy.lo中重新validation
 X-Cache-Detail:来自proxy.lo的“条件caching命中:实体刷新”
连线:closures
 Content-Type:application / json; 字符集= utf-8的

所以,我的问题是:为什么mod_proxy对每个请求执行重新validation,而不pipemax-age是否被定义?

NB Apache 2.4.3

谢谢,我会感激任何帮助。