如何强制window.location发出HTTP请求而不是使用缓存?

时间:2013-01-07 13:47:24

标签: javascript firefox browser

在我的网络应用程序中,我将window.location设置为导航到其他页面,但由于某种原因,Firefox会显示该页面的旧版本。

使用Firebug我检测到浏览器甚至没有发送HTTP请求,它只是使用该页面的旧版本(甚至不是最后一个版本)并显示它。

页面本身有all the usual headers以防止缓存在我使用链接或手动输入浏览页面时完美运行。只有在设置window.location时才会出现此问题。

这是Firefox问题还是其他浏览器的问题?这种行为可以改变吗?

5 个答案:

答案 0 :(得分:24)

您可以向网页网址添加随机参数,以便浏览器发出新请求。

所以不要使用

 window.location = "my.url/index.html";

使用

 window.location = "my.url/index.html?nocache=" + (new Date()).getTime();

答案 1 :(得分:3)

您可以将location.reload与true参数一起使用,该参数将始终绕过缓存。

window.location.reload(true);

答案 2 :(得分:0)

向网址添加一些特定时间或随机查询字符串值。这将强制重新加载页面。

var yourNewLoc = "http://newlocation.com/";
document.location = yourNewLoc + "?c=" + (new Date()).valueOf();

答案 3 :(得分:0)

您必须验证网址中是否存在任何现有查询参数。如果存在任何查询参数,则应使用“&”附加时间戳。我写了一个可能对你有帮助的快速片段。

window.newLocation = function( location ) {
    var newLocation = ( typeof location === "string" ) ? location : window.location.href,
       appendType = ( newLocation.indexOf("?") < 0 ) ? "?" : "&";
    window.location = newLocation + appendType + "_t=" + (new Date()).getTime();
}

用法:

newLocation("index.html") or window.newLocation("index.html") 
// opens "index.html?_t=<timstamp>"

newLocation("index.html?existingQuery=true") or window.newLocation("index.html?existingQuery=true") 
// opens "index.html?existingQuery=true&_t=<timstamp

newLocation() or window.newLocation() 
// opens existing window location with a timestamp

您可以进一步修改代码段以删除查询参数中的退出时间戳以避免重复

答案 4 :(得分:0)

只需要告诉您的下载功能(在控制器中,对于Laravel),不要通过设置标头来缓存它,而是对Laravel使用以下代码:

$headers =[
            'Content-Type' => 'application/text',
            'Cache-Control' => 'no-store, no-cache, must-revalidate, max-age=0',
            'Cache-Control' => 'post-check=0, pre-check=0, false',
             'Pragma' => 'no-cache',  ];
return response()->file($pathToFile, $headers);

此代码对PhP非常正确,也只需要相应地传输代码即可。通过添加新日期,可能会使链接无效,尤其是在您使用temporalSignedLink等的情况下。

欢呼