2012-07-13 162 views
22

我已经安装了一个应用程序,它在Opera和Firefox上运行得非常棒,但是在Google Chrome浏览器中缓存了AJAX请求,并且会显示过时的数据!阻止Chrome缓存AJAX请求

http://gapps.qk.com.au是应用程序。在Chrome中运行时,它甚至不会发送AJAX请求,但在其他浏览器中尝试时,它始终会执行AJAX请求并返回数据。

是否有任何方法(Apache/PHP/HTML/JS)阻止Chrome执行此操作?

的AJAX调用:

function sendAjax(action,domain,idelement) { 

        //Create the variables 
       var xmlhttp, 
        tmp, 
        params = "action=" + action 
          + "&domain=" + encodeURIComponent(domain) 

        xmlhttp = new XMLHttpRequest(); 
       //Check to see if AJAX request has been sent 
       xmlhttp.onreadystatechange = function() { 
        if (xmlhttp.readyState === 4 && xmlhttp.status === 200) { 
         $('#'+idelement).html(xmlhttp.responseText); 
        } 
       }; 
       xmlhttp.open("GET", "ajax.php?"+params, true); 
       xmlhttp.setRequestHeader("Content-type", "application/x-www-form-urlencoded"); 
       //console.log(params); 
       xmlhttp.send(params); 

      } 
sendAjax('gapps','example.com','gapps'); 
+0

什么是PHP脚本返回的头文件?确保他们不允许缓存,并返回适当的内容类型。 – mariusnn 2012-07-13 03:30:48

回答

26

浏览器的缓存行为有所不同在不同的设置。您不应该依赖于用户设置或用户的浏览器。也可以让浏览器忽略标题。

有两种方法可以防止缓存。

- >将AJAX请求更改为POST。浏览器不缓存POST请求。

- >更好的方法&好方法:使用当前时间戳或任何其他唯一编号为您的请求添加附加参数。

params = "action=" + action 
     + "&domain=" + encodeURIComponent(domain) 
     + "&preventCache="+new Date(); 
+0

我想这是一个解决方案,但我认为这是不雅,谢谢! :) – Mattisdada 2012-07-13 04:06:13

+1

只是为了信息和心灵的平静。这个解决方案被主要的框架使用,当你说preventCache to ajax时,一个例子就是DOJO。添加一些数字而不是日期 – gaurang171 2012-07-13 04:16:48

+0

真的吗?这对我来说似乎是一种“哈克”方法,它起作用(很好),但我原以为会有更好的方法作为“官方”做法。再次感谢! :) – Mattisdada 2012-07-13 05:50:40

11

另一个替代JavaScript解决方案是使用自定义页眉: 在PHP它应该是这样的:

<?php 
    header("Cache-Control: no-store, no-cache, must-revalidate, post-check=0, pre-check=0");//Dont cache 
    header("Pragma: no-cache");//Dont cache 
    header("Expires: Thu, 19 Nov 1981 08:52:00 GMT");//Make sure it expired in the past (this can be overkill) 
?> 
+0

这是否适用于所有浏览器?如果是这样,这是**多**更优雅的查询参数黑客... – tjameson 2013-07-16 16:40:47

+1

是的,它适用于所有浏览器:) – Mattisdada 2014-03-12 09:24:08

0

下面的一行代码为我工作。

$.ajaxSetup({ cache: false });