Google Chrome 在存在缓存清单时从缓存中获取 HTML 个文件

Google Chrome fetches HTML files from cache when cache manifest is present

我有一个网站,我在其中添加了 CACHE MANIFEST 文件。这是为了确保 iOS 中的 full-screen 网络应用程序不会从缓存中获取内容。 (否则,它们似乎正确刷新 HTML,但未链接 JavaScript 或 CSS。)在我的应用程序中,off-line 访问完全没用,因此我创建了清单以不缓存任何东西。这是它的样子:

CACHE MANIFEST

# Version 1.0

NETWORK:
*

这解决了我在 iOS 中的问题,但似乎弄乱了 Chrome (40.0.2214.115 m)。 Chrome 坚持总是从缓存中获取我的基本 html 文件,即使开发工具打开并 "Disable cache" 检查也是如此。如果我可以简单地 remove/rename 缓存清单文件并刷新,就可以解决问题。 此外,我的基础 HTML 文件有这些 headers:

<meta http-equiv="Cache-Control" content="no-cache, no-store, must-revalidate"/>
<meta http-equiv="Pragma" content="no-cache"/>
<meta http-equiv="Expires" content="0"/>

这里有我遗漏的东西吗?似乎很奇怪 Chrome 会做 more 缓存,当我有一个清单文件说要做 no 缓存时。

如果您在 HTML 文件中指定缓存清单,它将始终缓存到 applicationCache,无论它是否具有您发布的指定 headers/meta-tags(请参阅此处 Cache manifest caches network files).

如果您想避免缓存 JS 和 CSS 文件,只需使用 Web 应用程序根目录中的 .htaccess 文件。 例如使用 "ExpireByType" 命令:

<IfModule mod_expires.c>
  ExpiresActive On
  ExpiresDefault "access plus 0 seconds"
  ExpiresByType text/html "access plus 0 seconds"
  ExpiresByType text/plain "access plus 0 seconds"
  ExpiresByType text/javascript "access plus 0 seconds"
  ExpiresByType text/css "access plus 0 seconds"
  ExpiresByType image/png "access plus 0 seconds"
  ExpiresByType image/jpg "access plus 0 seconds"
  ExpiresByType image/jpeg "access plus 0 seconds"
</IfModule>

此外,您可以添加以下行以完全禁用您的网络应用程序的缓存(请参阅此 Disabling Caching with .htaccess):

  FileETag None
  <ifModule mod_headers.c>
    Header unset ETag
    Header set Cache-Control "max-age=0, no-cache, no-store, must-revalidate"
    Header set Pragma "no-cache"
    Header set Expires "Mon, 1 Jan 2010 01:00:00 GMT"
  </ifModule>

此行为已在 Chrome 41.0.2272.76 m 中修复。它不再使用清单文件从我的站点的缓存中获取文件。