阻止Chrome缓存AJAX请求

Mat*_*ada 26 javascript ajax google-chrome

我已经设置了一个应用程序,它在Opera和Firefox上运行得非常棒,但是在谷歌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');
Run Code Online (Sandbox Code Playgroud)

gau*_*171 32

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

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

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

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

params = "action=" + action 
         + "&domain=" + encodeURIComponent(domain) 
         + "&preventCache="+new Date();
Run Code Online (Sandbox Code Playgroud)

  • 只是为了信息和安心.主要框架使用此解决方案时,如果你说一个例子是DOJO,那么对于ajax调用是一个例子.添加一些数字而不是日期 (2认同)
  • 这是一个老问题,但它仍然出现在我的 Google 搜索查询的前 3 个结果中。发送自定义服务器标头(来自@Mattisdada 的回复)是处理不应该被缓存的文件的最佳方式。对于偶尔需要刷新的静态文件,发送带有您要加载的文件版本的参数(例如`params += '&preventCache=1.0.1'`),而不是当前时间戳。缓存仍然有效,更改版本字符串将刷新文件。 (2认同)

Mat*_*ada 14

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)
?>
Run Code Online (Sandbox Code Playgroud)