由于Origin' null'而Ajax请求被拒绝,原点是相同的而不是在localhost或本地文件

时间:2016-01-27 13:57:01

标签: javascript ajax cors bookmarklet sitemap.xml

已解决?,几乎......

这与Chrome(47.0.2526.73)处理xml文件的方式有关。我不知道细节,但这段代码在Firefox(43.0.4)中完全正常。

我仍然很好奇为什么会这样,或者如何让它在Chrome中运行。

我想做的事情:

创建一个javascript书签,检查404s / 500s /等的sitemap xml链接。

有问题的代码段:

    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

如果我导航到实际的站点地图http://www.example.com/sitemap.xml,则相同的代码会响应:

  

否'访问控制 - 允许 - 来源'标题出现在请求的上   资源。起源' null'因此不允许访问。

由于我的目标是提供可以在站点地图本身上调用的书签,这会在我的计划中产生问题。

如何测试:

1)从某个网站查找任何xml。 Google" filetype:xml sitemap"并寻找只是一个xml文件的响应(你会发现一些会重定向你)。

2)将上面的代码放在书签中,或直接放在浏览器的开发者控制台中。

3)确保将变量siteMap设置为当前URL。这符合CORS。你甚至可以做siteMap = location.href;

你会发现它在Firefox中运行良好,但在Chrome中却不行。

注意:

从HTML页面执行代码,以HTML页面为目标 从HTML页面执行代码,以XML页面为目标 从XML页面执行代码,定位HTML页面 工作
从XML页面执行代码,以XML页面为目标 工作

研究我已经完成了:

我能找到的关于这个错误的一切(可以理解)与:

有关
  1. 跨域请求
  2. 在localhost,file:///或本地计算机上具有源或目标。
  3. 我的情景不是这些。

2 个答案:

答案 0 :(得分:2)

行。

之前,我说:

  

因此,当您使用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.
 */
     

即使网址显示“http://www.example.com/sitemap.xml”,也是如此   在控制台window.location.href中   “http://www.example.com/sitemap.xml”, location.origin是   “”http://www.example.com“,实际上,起源是(结果域),就像它一样   是一个扩展页面。因为它是。

     

因此对于xml页面,origin实际上总是 null

不一定是这种情况。

我发现了这个:
Chrome adding Origin header to same-origin request

在Firefox上测试确认FF没有在同源GET或HEAD请求上设置Origin,但Chrome确实如此。这通常不是问题,但在XML页面上,document.domain设置为null。因此它设置的原点为null。

可能是Chrome中的错误?还是故意的?

我仍然不满意自己的答案......

测试

  • 转到Chrome中的任何xml页面。
  • 在控制台中,发出任何AJAX请求。
  • 检查网络标签中的请求标头:

    Accept:*/* Accept-Encoding:gzip, deflate, sdch Accept-Language:en-GB,en-US;q=0.8,en;q=0.6 Cache-Control:no-cache Connection:keep-alive Host:www.example.com Origin:null Pragma:no-cache User-Agent:Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/47.0.2526.73 Safari/537.36

向上投票jaromanda-x,因为他的直觉导致了我的答案。

答案 1 :(得分:0)

您的http://www.example.com/sitemap.xml与您的脚本所在的域名不同吗?如果是,浏览器将出于安全原因阻止请求。您可能想了解如何使用CORS

  

常规网页可以使用XMLHttpRequest对象从远程服务器发送和接收数据,但它们受到相同原始策略的限制。扩展不是那么有限。扩展可以与其来源之外的远程服务器通信,只要它首先请求跨源权限。

您可以详细了解相同的原始政策here