x requested with php,PHP / Ajax“Vary:X-Requested-With”对我不起作用!

本文探讨了在PHP中如何处理Ajax请求与浏览器缓存的问题。当一个PHP脚本根据HTTP_X_REQUESTED_WITH头部提供不同内容时,可能会导致错误的缓存响应。作者发现,如果不包含X-Requested-With头的Ajax响应,Firefox会错误地从缓存中提供内容。解决方案是为Ajax请求使用不同的URL或者确保在Ajax响应中包含X-Requested-With头来避免缓存冲突。
摘要由CSDN通过智能技术生成

我正在尝试提供可缓存的内容,具体取决于它是否是ajax请求.

场景:

一个小的PHP脚本“/test.php”提供一些HTML输出并设置以下标题:

Expires Wed, 23 Feb 2011 13:30:06 GMT

Cache-Control public, max-age=60

Vary X-Requested-With,Accept-Encoding

输出取决于$_SERVER [‘HTTP_X_REQUESTED_WITH’]状态.

当我的Firefox指向Url时,我得到输出,并且对于下一分钟,我从Browser-Cache获得相同的结果,而不是命中服务器.好的,到目前为止.

当我通过XMLHttpRequest(使用X-Requested-With:XMLHttpRequest Header)请求相同的资源时,我的Firefox不会请求服务器,而是提供来自Cache的(错误)响应!

换句话说,它是一样的.资源上的Ajax-Call填充缓存,后续的Browser-Request服务于Cache的(错误)响应.

有没有人有这方面的经验?我认为这应该是一个很常见的问题 – 根据是否是ajax(在同一个URL上)提供内容.

问候,Ilja

解决方法:

我可以重现这个,但前提是我没有在ajax响应中包含X-Requested-With标头.如果我为ajax调用设置了标头,它主要按预期工作,虽然ajax调用清除了常规请求的缓存,反之亦然 – 内容不会被缓存,但是你永远不会得到错误的内容.

我的PHP文档看起来像这样:

putenv('TZ=PST8PDT');

date_default_timezone_set('America/Los_Angeles');

header('Expires: '.gmdate("D, d M Y H:i:s").' GMT');

header('Cache-Control: public, max-age=60');

header('Vary: X-Requested-With,Accept-Encoding');

echo 'it is now '.date('Y-m-d H:i:s');

?>

我的测试页面是这样的:

load into frame


load into div via ajax

function load(){

var req = new XMLHttpRequest();

req.onreadystatechange = function(){

if (req.readyState == 4){

document.getElementById('di').textContent = req.responseText;

}

}

req.open('GET', 'resource.php', 1);

req.setRequestHeader("X-Requested-With", "XMLHttpRequest");

req.send(null);

return false;

}

当我点击第一个链接时,它会从服务器请求.当我再次点击它时,它来自缓存.每次后续点击都来自缓存,最多60秒.

当我点击第二个链接时,请求将转到服务器.当我再次点击它时,它来自缓存.每次后续点击都来自缓存,最多60秒.

如果我点击链接1,然后链接2,它们都会进入服务器.如果我再次点击链接1,它会再次进入服务器(这是错误的).演示序列(假设全部在60s内):

Reg : server

Reg : cache

Reg : cache

Reg : cache

Ajax : server

Ajax : cache

Reg : server

Ajax : server

结果是,如果你想通过ajax服务时可靠地缓存不同的东西,在发出ajax请求时使用不同的URL(?ajax = 1可以正常工作).

我正在测试最新的FF 4.0

标签:php,ajax,caching,header,vary

来源: https://codeday.me/bug/20190710/1420516.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值