我正在尝试让 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
这首先需要进行更多的调试,因为它不适合注释,但应该有助于提高任何对象的缓存。