Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/382.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript Ajax请求因来源而被拒绝';空';,原点相同,不在本地主机或本地文件上_Javascript_Ajax_Cors_Bookmarklet_Sitemap.xml - Fatal编程技术网

Javascript Ajax请求因来源而被拒绝';空';,原点相同,不在本地主机或本地文件上

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,

已解决?,几乎..

这与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,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
    而不是of
    http://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