我对 mod_cache 和 ETags 有疑问。这是我的场景:
环境:Firefox、Apache 2.2.22(Mac OSX 默认)、任何 Web App,Apache 是 Web App 的代理
初始状态:
- 浏览器有一个(过期的)doc /aaa 缓存版本,ETag=123
- Apache 有一个(过期的)缓存版本的 doc /aaa,ETag=123
设想:
- 浏览器请求 /aaa, If-None-Match: 123
- Apache 请求 /aaa, If-none-Match: 123 from Web App
- Web 应用返回 304
- Apache 将他的缓存版本返回给浏览器 (200)
Apache 不应该向浏览器返回 304 吗?
附加信息:
- 如果Apache没有缓存版本的/aaa,他将ETag转发给Web App,得到304,返回304给浏览器
- 使用 Last-Modified/If-Modified-Since 而不是 ETags 工作(从 Web 应用程序获取 304 后,Apache 将 304 返回到浏览器)
一个更简单的场景:
- Apache 版本未过期 (ETag: 123) - 他不需要从 Web App 获得刷新
- 获取 /aaa,如果没有匹配:123
- 响应:200(而不是 304?)
阿帕奇会议
CacheRoot /private/var/log/apache2/cache/
CacheEnable disk /
CacheDirLevels 5
CacheDirLength 3
CacheIgnoreCacheControl On
CacheIgnoreHeaders Set-Cookie
<Proxy *>
Order deny,allow
Allow from all
</Proxy>
ProxyPass / ajp://localhost:8009/ retry=0
ProxyPassReverse / ajp://localhost:8009/
ProxyPreserveHost on
请求/响应标头:
GET / HTTP/1.1
Accept: */*
If-None-Match: 123456
HTTP/1.1 200 OK
Date: Tue, 01 Oct 2013 14:01:16 GMT
ETag: 123456
Expires: Tue, 01 Oct 2013 14:30:55 GMT
Cache-Control: max-age=1800
Content-Language: en-US
Age: 21
Content-Length: 20186
Content-Type: text/html;charset=UTF-8