如何防止 lighttpd 缓存静态文件,即使在磁盘上被修改?

如何防止 lighttpd 缓存静态文件,即使在磁盘上被修改?

我使用 lighttpd 来提供静态文件。我在一个目录中有一堆图像,我会定期更新它们。这会更改文件内容(和文件大小)以及修改日期,但不会更改文件名。

当我通过 http 访问文件时,更新不会被考虑在内,lighty 会提供旧文件。我可以手动将文件重命名为其他名称,然后 lighttpd 将返回 404 错误,如果我将文件重命名,我将获得正确的更新版本。似乎 lightty 正在使用某种自己的缓存机制(这很好)来返回静态文件。不幸的是,当文件被修改时,这种机制似乎不会自行更新。

我通过 Wireshark 检查了一下,我的浏览器确实在向文件发出请求,这不是浏览器缓存问题。当从空缓存中请求时,它会返回 200 OK,否则会返回 304 Not Modified,这与预期一致。但文件返回了错误的 Last-Modified 标头,不反映真实的最后修改日期。

也许有一些我不知道的配置指令?

我希望 lighty 返回的文件能够直接反映磁盘上所做的更改,或者至少能够使其缓存无效。

向关注此问题的人更新:我找到了罪魁祸首。如果我更新静态文件,Lighty 不会返回新内容,但会在其标题中返回新的 Content-Length,从而导致显示垃圾。如果我使用 mod_compress 压缩文件,则问题会消失,因为 mod_compress 使用其自己的缓存系统。不幸的是,我无法压缩所有文件(例如图像文件)。所以这只是一个部分修复,但我稍后会回来并希望找到解决方案。

答案1

我终于找到了问题所在。它来自 VirtualBox。

在主机(Win)中编辑文件时,客户机(Linux)中的 lighttpd 无法正确更新文件内容(但可以正确更新文件大小),从而返回被裁剪或乱码的内容。

卸载我的共享驱动器并重新安装它们,或者直接在客户机中编辑文件,解决了该问题。

我花了六个月的时间才最终弄明白这一点。

答案2

您没有提到是否安装了 mod_cache?安装后,此模块默认为“启用”。

我不愿意提出这个建议,但是打开 Etags 有帮助吗?

答案3

这个 lighttpd 选项对我有用

server.network-backend = "writev" 

答案4

尝试这些 etag 条目,看看它们是否有帮助:

lighthttpd 的缓存控制规则

相关内容