在IE和Firefox中无法从服务器重新加载HTML5文件


Unable to reload HTML5 file from server in IE and Firefox

我有一个HTML5页面,它显示的只是一个名字列表,一个简单的表单,用户可以在其中填写他们的名字。提交按钮作为动作调用一个PHP文件,该文件向列表中添加/删除该名称,然后(通过使用header())重定向回调用该PHP文件的HTML文件。

在Google Chrome浏览器中,用户点击提交按钮后,他立即看到他的名字被正确地添加/删除到名称列表中。

在IE、Firefox中(有人也为我在Android和Safari中测试过),点击提交按钮后,显示的是html文件的前一个版本,没有PHP文件中代码所做的更改。即使在重新加载之后,甚至在清除缓存之后,我在IE和Firefox中尝试过,仍然显示旧版本。而在同一时间,在Chrome加载文件确实显示改变(=当前)的版本。只需要20分钟左右,就可以在IE和FF中加载更新后的html文件了。即使用JS window.location.reload(true);重新加载,只是为了看看是否至少强制更新版本,也不会更新页面(它会重新加载,但仍然显示未更改的版本)。

我在网上搜索了大约6个小时,但没有找到解决方案,甚至没有其他人报告这个问题。在html5中添加META HTTP-EQUIV ...是无效的,而且(最终还是尝试了)并不能解决任何问题。我没有使用缓存清单(从未使用过)。所以页面不应该被缓存,但正如我提到的,即使清除缓存并重新加载也不会给出新版本的页面(即使在重新启动IE/FF之后)。

我还在学习,去年才开始设计网页。因此,我(显然)并不确切地知道服务器和浏览器之间发生的所有事情。所以这个问题对我来说很奇怪,我很想知道这里发生了什么。此外,对于这个页面来说,从服务器下载和显示当前版本是至关重要的,因为用户需要看到他们的名字被添加/删除到列表中。

这是html页面的大纲(对不起,可能不是正确的英文单词):

<!DOCTYPE html>
<html>
  <head>
    <title>Title text</title>
    <link rel='stylesheet' type='text/css' href='corStylesheet.css' />
    <meta name='robots' content='noindex,nofollow' />
  </head>
  <body>
    [content here]
    <script src='corJavaScript.js'> // (some of the js did not work when place in head)
    </script>
  </body>
</html>

所以,我基本上有两个问题:1. 这是怎么回事?也就是说,如何这是不可能加载当前版本的HTML文件?2. 如何强制从服务器下载并显示当前版本?

如果您希望每次强制浏览器重新加载页面,您可以设置标题,以便不允许缓存文件。

你可以通过PHP来实现(在这里阅读更多关于它的信息);

header("Cache-Control: no-cache, must-revalidate");

也可以直接在HTML中设置:

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

EDIT:刚刚找到一个关于如何在不同语言中设置这个的非常好的帖子;如何控制网页缓存,跨所有浏览器?

在PHP端的重定向中,您可以添加一些数字unix时间或微unix时间让浏览器认为它是新页面:

header('location: yourhtmlfile.html?'.microtime());

我的(Javascript)方法是,在请求的URL后面附加一个随机字符串。

资源被认为是一个新的资源,绕过浏览器的缓存。

这也适用于当你想从一个地址,你不能添加/修改响应头(如第三方CDN)重新加载外部资源。

var currentUrl = document.URL;
if (currentUrl.search('?') === -1) {
    window.location.href = currentUrl + '?' + Math.floor(Math.random() * 11);
} else {
    window.location.href = currentUrl + '&' + Math.floor(Math.random() * 11);
}