Apache returns 旧 Etag 和 LastModified

Apache returns old Etag and LastModified

我的网站有多个页面(例如 1.htm 和 2.htm)和一些脚本文件,从该页面引用。

我的 .htaccess 文件包含以下代码:

FileETag MTime Size
<ifModule mod_expires.c>
  ExpiresActive On
  ExpiresByType text/html "access plus 1 day"
  ExpiresByType text/css "access plus 1 week"
  ExpiresByType text/javascript "access plus 1 week"
  ExpiresByType application/javascript "access plus 1 week"
  ExpiresByType application/x-javascript "access plus 1 week"
  ExpiresByType image/gif "access plus 1 year"
  ExpiresByType image/jpeg "access plus 1 year"
  ExpiresByType image/png "access plus 1 year"  
</ifModule>

我访问页面 1.htm,然后更改脚本文件并导航到页面 2.htm。我希望 Apache 将 return 新的 Etag/LastModified 值和脚本文件将被更新。但它 return 的旧值。怎么了?

当我刷新页面时,我得到了新的 Etag/LastModified 值。

缓存的意义在于您不必在指定的时间内再次下载文件。

所以这一行:

ExpiresByType text/html "access plus 1 day"

意味着如果您在同一天访问该页面,则该页面将从缓存而不是服务器提供。因此,您不会获得新页面或新 Etag/Expiry headers。例如,如果您在 Chrome 中加载开发人员工具,您会看到页面已加载 "from cache".

如果它仍在缓存中并且您刷新它,那么浏览器会与服务器仔细检查文件是否已更改,如果没有更改则返回 301,如果已更改则重新下载页面(包括新的headers)。但是对于正常的页面加载,它甚至不会与服务器进行此检查并直接从您的缓存中提供服务。这就是它应该工作的方式。

因此,通过上述设置,您网站的访问者在您更改页面后最多 1 天内仍然可以看到旧版本的页面。

您可以将 must-revalidate 添加到缓存 headers,这样它就会缓存并每次都与服务器进行检查,但这会失去缓存的大部分好处。

顺便说一句,您不应该将 Etags 与 Apache 一起使用,因为它们在同时使用 gzip 时不起作用。此处有更多详细信息:https://www.tunetheweb.com/performance/http-performance-headers/etag/