【问题标题】:mod_cache + ETag: Apache does not reply 304 to clientmod_cache + ETag:Apache 不向客户端回复 304
【发布时间】:2013-10-07 13:24:24
【问题描述】:

我对 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 来自 Web 应用
  • 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 获取刷新
  • GET /aaa, If-None-Match: 123
  • 响应:200(而不是 304?)

apache 配置

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

【问题讨论】:

  • 可以添加相关配置吗?以及产生这个的所有请求和响应的确切标头?
  • 我有同样的问题很长时间了,无法适应它:(
  • 您使用的是 gzip 吗(如果没有,为什么不使用!)?如果您的请求/响应标头不是,但不确定这是否是缩减集。如果是这样,请尝试关闭 Etags,它应该可以工作,因为 Apache 中存在带有 Etags 和 Gzip 的错误。如果事实证明是这样,将在答案中解释更多。

标签: apache etag mod-cache


【解决方案1】:

根据protocol specification,If-None-Match 标头应该用 " 包裹。

尝试发送:

If-None-Match: "123"

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-12-02
    • 1970-01-01
    • 1970-01-01
    • 2011-06-30
    • 2021-07-19
    • 2019-01-12
    • 2013-10-26
    • 1970-01-01
    相关资源
    最近更新 更多