Apache返回旧的Etag和LastModified

时间:2015-11-11 19:44:14

标签: apache .htaccess caching etag last-modified

我有一个包含多个页面的网站(例如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值。

1 个答案:

答案 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/