4

解决了?,几乎..

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

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

我正在尝试做的事情:

创建一个 javascript 小书签来检查404s/500s/等的站点地图 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,相同的代码会响应:

请求的资源上不存在“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:/// 或其他本地机器上。

我的情况不是这些。

4

2 回答 2

2

好的。

之前,我说过:

因此,当您使用 Firefox 或 Chrome(大概是 IE)查看 xml 文件时,您查看的实际上是由浏览器内置的 xml parser 创建的文档

在 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 ”,并且位置.origin 是“ http://www.example.com ”,实际上,origin 是(nodomain),就好像它是一个扩展页面。因为它是。

因此,对于 xml 页面,origin 实际上始终为空。

情况不一定如此。

我发现了这个:
Chrome 将 Origin 标头添加到同源请求

在 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,因为他的直觉让我找到了答案。

于 2016-01-27T15:30:19.487 回答
0

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

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

您可以在此处阅读有关同源政策的更多信息

于 2016-01-27T14:05:06.230 回答