Javascript Ajax请求因来源而被拒绝';空';,原点相同,不在本地主机或本地文件上
已解决?,几乎.. 这与Chrome(47.0.2526.73)处理xml文件的方式有关。我不知道细节,但这段代码在Firefox(43.0.4)中运行得非常好 我仍然很好奇为什么会这样,或者如何让它在Chrome中工作 我想做什么: 创建一个javascript书签来检查404s/500s/etc的链接 有问题的代码片段:Javascript Ajax请求因来源而被拒绝';空';,原点相同,不在本地主机或本地文件上,javascript,ajax,cors,bookmarklet,sitemap.xml,Javascript,Ajax,Cors,Bookmarklet,Sitemap.xml,已解决?,几乎.. 这与Chrome(47.0.2526.73)处理xml文件的方式有关。我不知道细节,但这段代码在Firefox(43.0.4)中运行得非常好 我仍然很好奇为什么会这样,或者如何让它在Chrome中工作 我想做什么: 创建一个javascript书签来检查404s/500s/etc的链接 有问题的代码片段: var siteMap="http://www.example.com/sitemap.xml"; var httpPoke = function(url,
var siteMap="http://www.example.com/sitemap.xml";
var httpPoke = function(url,callback){
var x;
x = new XMLHttpRequest();
x.open('HEAD', url);
x.onreadystatechange = function() {
if (this.readyState == this.DONE) {
callback(this.status);
}
}
x.send();
};
var response=httpPoke(siteMap,function(n){
console.log(n);
});
如果我在域中的任何其他页面上,响应为:
200
如果我导航到实际的站点地图,相同的代码会响应:
请求的服务器上不存在“Access Control Allow Origin”标头
资源。因此,不允许访问源“null”
因为我的目标是提供一个bookmarklet,它可以在站点地图本身上调用,这给我的计划带来了麻烦
如何对此进行测试:
1) 从某个网站上查找任何xml。谷歌“filetype:XMLSiteMap”并寻找一个仅仅是xml文件的响应(你会发现一些会重定向你)
2) 将上面的代码放在bookmarklet中,或直接放在浏览器的开发人员控制台中
3) 确保变量siteMap设置为当前URL。这将符合CORS。你甚至可以做siteMap=location.href
你会发现它在Firefox中运行良好,但在Chrome中却不行
注:
从HTML页面执行代码,目标是HTML页面确实有效。从HTML页面执行代码,以XML页面为目标确实有效。
从XML页面执行代码,以HTML页面为目标不起作用。
从XML页面执行代码,以XML页面为目标不起作用 我所做的研究: 我能找到的关于这个错误的一切(可以理解)都与:
我的情况不是这两种情况 您的
http://www.example.com/sitemap.xml
与脚本所在的域不同吗?如果是,浏览器将出于安全原因阻止请求。您可能想看看如何使用
常规网页可以使用XMLHttpRequest对象从远程服务器发送和接收数据,但它们受到同源策略的限制。扩展没有那么有限。扩展可以与其源站之外的远程服务器进行通信,只要它首先请求跨源站权限
您可以阅读有关同一原产地政策的更多信息确定
我以前说过:
因此,当您使用Firefox或Chrome(或IE)查看xml文件时,
大概),您正在查看的实际上是由创建的文档
浏览器内置的xml解析器
在Chrome的情况下,这是从(nodomain)提供的,并且是
如是:
/* Copyright 2014 The Chromium Authors. All rights reserved.
* Use of this source code is governed by a BSD-style license that can be
* found in the LICENSE file.
*/
所以即使URL上写着“”,而且
在控制台窗口中。location.href为
“”和location.origin为
“”,实际上,origin是(nodomain),就好像它
是一个扩展页。因为它是
因此,对于xml页面,origin实际上总是空的
情况未必如此
我找到了这个:在Firefox上的测试确认FF不会在同一来源GET或HEAD请求上设置来源,但Chrome会。这通常不是问题,但在XML页面上document.domain设置为null。因此,它设置的来源为null 可能是Chrome中的bug?还是故意的 我仍然对自己的答案不满意 测试此项:
- 转到Chrome中的任何xml页面
- 在控制台中,发出任何AJAX请求
- 检查“网络”选项卡中的请求标头:
接受:*/* 接受编码:gzip、deflate、sdch 接受语言:en GB,en US;q=0.8,en;q=0.6 缓存控制:没有缓存 连接:保持活力 主持人:www.example.com 来源:空 Pragma:没有缓存 用户代理:Mozilla/5.0(Windows NT 6.1;WOW64)AppleWebKit/537.36(KHTML,类似Gecko)Chrome/47.0.2526.73 Safari/537.36
去投票支持他的直觉,他的直觉引导我找到了答案。你控制sitemap.xml文件/服务器吗?我觉得这与它是一个xml页面有关类似的问题:Jaromanda,你是对的!我刚刚尝试了其他人的xml站点地图(只是在谷歌上搜索了“filetype:xml sitemap”并选择了一个)发生了完全相同的事情。这确实很奇怪。根据location.origin,origin不是null。我正在作为bookmarklet或在控制台中执行,xml文件的错误仍然存在。因此,如果您尝试完全相同的代码,但使用HTML文件,会发生什么?也就是说,
http://www.example.com/sitemap.html
而不是ofhttp://www.example.com/sitemap.xml
?不,所有内容都在同一个域中,托管在同一个域中(远程)服务器。为了澄清,从www.example.com/或www.example.com/some-other-page/works运行此脚本。但是从www.example.com/sitemap.xml运行此脚本不起作用。相同的域,相同的web服务器。您可以提供任何支持参考吗?此外,示例代码会发出HEAD请求。没有文档返回到浏览器,因此似乎存在no要解析的XML。正确吗?就在XML文件中打开时在浏览器窗口中看到的视图而言,这只是一种方便的浏览器UI呈现方式,与使用XHR或fetch()为XML文档提供URL时在浏览器中运行的JS代码以编程方式对XML所做的操作无关
或其他任何内容。据我所知,您在这里给出的答案中没有任何信息能够真正回答您的问题。对于Chrome中的XML文档,来源绝对不总是空的。因此我不知道您的问题的真正原因是什么,但我是p