【问题标题】:Ajax request rejected due to Origin 'null', origin IS the same and NOT on localhost or local fileAjax 请求因 Origin 'null' 而被拒绝,origin 相同,不在 localhost 或本地文件上
【发布时间】:2016-05-04 12:30:57
【问题描述】:

解决了?,几乎..

这与 Chrome (47.0.2526.73) 如何处理 xml 文件有关。我不知道细节,但这段代码在 Firefox (43.0.4) 中运行良好。

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

我正在尝试做的事情:

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

有问题的代码 sn-p:

    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,相同的代码会响应:

请求中没有“Access-Control-Allow-Origin”标头 资源。因此不允许访问 Origin 'null'。

由于我的目标是提供一个可以在站点地图本身上调用的书签,因此这对我的计划产生了影响。

如何测试:

1) 从某个网站查找任何 xml。谷歌“filetype:xml 站点地图”并寻找只是一个 xml 文件的响应(你会发现有些会重定向你)。

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

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

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

注意:

从 HTML 页面执行代码,以 HTML 页面为目标确实有效
从 HTML 页面执行代码,以 XML 页面为目标确实有效
从 XML 页面执行代码,以 HTML 页面为目标确实 工作
从 XML 页面执行代码,以 XML 页面为目标确实 工作

我所做的研究:

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

  1. 跨域请求
  2. 在 localhost、file:/// 或本地计算机上具有源或目标。

我的情况不是这些。

【问题讨论】:

  • 你控制sitemap.xml文件/服务器吗?
  • 我觉得这与它是一个xml页面有关
  • Jaromanda,你是对的!我刚刚尝试使用其他人的 xml 站点地图(只是用谷歌搜索“filetype:xml 站点地图”并选择了一个),并且发生了完全相同的事情。这确实很奇怪。根据 location.origin,原点不为空。我正在作为书签或控制台执行,但 xml 文件仍然存在错误。
  • 那么,如果您尝试完全相同的代码但使用 HTML 文件会发生什么?即http://www.example.com/sitemap.html 而不是http://www.example.com/sitemap.xml?

标签: javascript ajax cors bookmarklet sitemap.xml


【解决方案1】:

好的。

之前,我说过:

因此,当您使用 Firefox 或 Chrome(或 IE, 大概),您正在查看的实际上是由 浏览器的内置 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 显示“http://www.example.com/sitemap.xml”,并且 在控制台 window.location.href 是 “http://www.example.com/sitemap.xml”, location.origin 是 ""http://www.example.com",其实origin是(nodomain)就好象 是一个扩展页面。因为它是。

所以对于 xml 页面来说,origin 实际上总是 null

情况不一定如此。

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

在 Firefox 上的测试确认 FF 不会在同源 GET 或 HEAD 请求上设置 Origin,但 Chrome 会。这通常不是问题,但在 XML 页面上 document.domain 设置为 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,因为他的直觉让我找到了答案。

【讨论】:

  • 你能提供任何支持参考吗?此外,示例代码发出 HEAD 请求。没有文档返回到浏览器,因此似乎没有要解析的 XML。对吗?
  • 就您在浏览器窗口中打开 XML 文件时获得的视图而言,这只是一种方便的浏览器 UI 渲染,与您在浏览器中运行的 JS 代码的作用无关当您使用 XHR 或 fetch() 或其他任何方式为其提供 XML 文档的 URL 时,以编程方式使用 XML。据我所知,您在此处的答案中提供的信息都没有真正回答您的问题。对于 Chrome 中的 XML 文档,来源绝对不总是 null。所以我不知道你的问题的真正原因是什么,但我很确定这不是你想象的那样。
  • 我有点希望你是对的,这不是一个令人满意的答案。您说过,“当您使用 XHR 或 fetch() 或其他任何方式为 XML 文档提供 URL 时,您在浏览器中运行的 JS 代码以编程方式对 XML 执行的操作与您的操作没有任何关系。”假设是的。实际情况似乎并非如此。如果您使用 Chrome 浏览到 xml 文档,就 Http 请求而言,您的来源始终为空。也许这是因为您正在查看的实际上是 xml 解析器。或者,也许这是一个错误。在“来源”标签上,它仍然模棱两可。
  • @Roberto,在这个例子中我们还没有解析。只是试图达到它。
【解决方案2】:

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

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

您可以阅读更多关于同源政策here

【讨论】:

  • 不,一切都在同一个域中,托管在同一个(远程)服务器上。澄清一下,从 www.example.com/ 或 www.example.com/some-other-page/ 运行此脚本有效。但从 www.example.com/sitemap.xml 没有。同一个域,同一个网络服务器。
猜你喜欢
  • 1970-01-01
  • 2013-05-16
  • 1970-01-01
  • 2020-11-19
  • 1970-01-01
  • 2013-03-10
  • 2012-05-12
  • 1970-01-01
  • 2021-12-28
相关资源
最近更新 更多