我有一个包含多个页面的网站(例如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将返回新的Etag / LastModified值,并且脚本文件将被更新。但它返回旧的价值观。有什么问题?
当我刷新页面时,我获得了新的Etag / LastModified值。
答案 0 :(得分:1)
缓存的重点是您不必在指定时间内再次下载文件。
所以这一行:
ExpiresByType text/html "access plus 1 day"
表示如果您在同一天访问该页面,则该页面将从缓存而不是从服务器提供。因此,您将无法获得新页面,也无法获得新的Etag / Expiry标头。例如,如果您在Chrome中加载开发者工具,则会看到该页面是“从缓存中”加载的。
如果它仍然在缓存中并且你刷新它,那么浏览器会对服务器进行双重检查,如果文件已经更改则返回301(如果没有),并重新加载页面(如果已更改)(包括新标题) 。但是通过正常的页面加载,它甚至不会对服务器进行此检查,并直接从缓存中提供。这是它应该工作的方式。
因此,通过上述设置,您的网站访问者在更改后最多可能会在1天内看到旧版本的网页。
您可以将必须重新验证添加到缓存标头中,这样它就会缓存并且每次都会检查服务器,但这会失去缓存的大部分好处。
顺便说一句,顺便说一句,你不应该使用Etags和Apache,因为它们在使用gzip时也不起作用。更多详情:https://www.tunetheweb.com/performance/http-performance-headers/etag/