客户端发送 If-Modified-Since 标头时,Apache 缓存被禁用

客户端发送 If-Modified-Since 标头时,Apache 缓存被禁用

我正在尝试让 Apache 缓存运行昂贵的 PHP 脚本的结果(它访问具有速率限制的第三方服务器),但似乎如果客户端发送标头,If-Modified-Since缓存就会被绕过。

CacheEnable disk /script.php
CacheLock on
CacheLockMaxAge 60
CacheIgnoreHeaders Set-Cookie
# prevent client explicitly requesting un-cached content
CacheIgnoreCacheControl on
CacheDetailHeader on

php 脚本在其响应中设置以下标头:

  • Last-Modified设置为当前时间,例如Sun, 20 Jun 2021 11:30:20 GMT
  • Expires设置为当前时间加 60 秒,例如Sun, 20 Jun 2021 11:31:20 GMT

如果我发出以下请求:

GET /script.php HTTP/1.1
Host: example.com
Connection: close

然后缓存就可以正常工作,并且 php 脚本每分钟只运行一次,其他请求则从缓存中提供。

但是发出以下请求:

GET /script.php HTTP/1.1
Host: example.com
Connection: close
If-Modified-Since: Sun, 20 Jun 2021 11:30:30 GMT

每次运行 php 脚本:

X-Cache-Detail: "cache miss: attempting entity save" from example.com

在回应中。

我在 Ubuntu 18.04 上使用 Apache 2.4.29。

答案1

Apache.org 的 Mod-Cache 手册

https://httpd.apache.org/docs/2.4/mod/mod_cache.html

使用自定义日志来识别问题

CustomLog "cached-requests.log" common env=cache-hit
CustomLog "uncached-requests.log" common env=cache-miss
CustomLog "revalidated-requests.log" common env=cache-revalidate
CustomLog "invalidated-requests.log" common env=cache-invalidate

启用 X-Cache-Detail 标头

CacheDetailHeader 开启

设置为忽略查询缓存控制字符串

CacheIgnoreCacheControl On
CacheIgnoreQueryString on

使用像 url.com/my.php?jsessionid=123 这样的会话令牌不应该被缓存,甚至不应该单独

CacheIgnoreURLSessionIdentifiers jsessenionid

使用最小修改因子,未缓存的请求将被传递 0.0 = 0% 或 1.0 = 100%

CacheLastModifiedFactor 0.99

设置有效缓存的最短时间(默认 0)

CacheMinExpire 3600

在采取行动之前删除 if-Modfied 标头

Header unset Last-Modified 
* Can also be used in htaccess

这首先需要进行更多的调试,因为它不适合注释,但应该有助于提高任何对象的缓存。

相关内容