mod_cache + ETag:Apache不回复304给客户端

时间:2013-10-01 11:42:42

标签: apache etag mod-cache

我有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:来自Web App的123
  • Web App返回304
  • Apache将其缓存版本返回到浏览器(200)

Apache不应该将304返回浏览器吗?

其他信息:

  • 如果Apache没有缓存版本的/ aaa,他会将ETag转发到Web App,获取304,然后将304返回浏览器
  • 使用Last-Modified / If-Modified-Since而不是ETags工作(从Web App获得304后,Apache将304返回浏览器)

更简单的方案:

  • Apache版本未过期(ETag:123) - 他不需要从Web App刷新
  • GET / aaa,If-None-Match:123
  • 回复:200(而不是304?)

apache conf

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

1 个答案:

答案 0 :(得分:0)

根据protocol specification,If-None-Match标头应包含

尝试发送:

If-None-Match: "123"