V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
推荐关注
Meteor
JSLint - a JavaScript code quality tool
jsFiddle
D3.js
WebStorm
推荐书目
JavaScript 权威指南第 5 版
Closure: The Definitive Guide
HanningWu
V2EX  ›  JavaScript

XMLHttpRequest 跨域请求(Cross Origin Request)错误

  •  
  •   HanningWu · 2017-03-03 16:17:52 +08:00 · 4744 次点击
    这是一个创建于 2820 天前的主题,其中的信息可能已经有所发展或是发生改变。

    同样的 JavaScript 脚本文件,在我的 macOS 终端下用 PhantomJS 能正常发送请求;放到另一台同样安装了 PhantomJS 的 Ubuntu 16.04 系统下就出现这个错误

    XMLHttpRequest cannot load https://[website].com Cross Origin Requests are not supported.

    Google 了一下,有许多人出现了非常类似但是不完全相同的错误,比如

    1. XMLHttpRequest cannot load https://[website].com Cross origin requests are only supported for HTTP
    2. XMLHttpRequest cannot load https://www.[website].com/ No 'Access-Control-Allow-Origin' header is present on the requested resource.

    以上这两种错误前部分与我的是一样的,但是后半部分加粗的信息不同。 尤其是第 2 条,我添加了 Access-Control-Allow-Origin 这个 header 到我的请求头中,我的错误仍然会出现。

    不知道有没有有 V 友能帮忙找一下原因。

    29 条回复    2017-03-06 14:36:56 +08:00
    momocraft
        1
    momocraft  
       2017-03-03 16:51:55 +08:00
    可以看一下 mdn 的 CORS 那页
    surfire91
        2
    surfire91  
       2017-03-03 17:10:19 +08:00
    把 Request 和 Response 都贴下
    ck65
        3
    ck65  
       2017-03-03 17:13:05 +08:00 via iPhone
    Allow origin 头不是请求方加的,是响应方加的。如 1 楼看看 cors 文档或教程吧。
    HanningWu
        4
    HanningWu  
    OP
       2017-03-03 17:38:51 +08:00 via iPhone
    @surfire91 就比如说
    //myfile.js
    var request = new XMLHttpRequest();
    request.open('GET', "https://www.v2ex.com/", false); //这里用同步请求,不用异步
    request.send();
    if (request.status === "200") {
    console.log("Succeed!");
    } else {
    console.log("Failed!");
    }
    在 Ubuntu 系统终端下运行 phantomjs myfile.js 结果是两行错误
    XMLHttpRequest cannot load https://www.v2ex.com/. Cross origin requests are not supported.
    NETWORK_ERROR: XMLHttpRequest Exception 101: A network error occurred in synchronous requests.

    但是在我的 macOS 下运行不会出错
    surfire91
        5
    surfire91  
       2017-03-03 17:48:39 +08:00
    PhantomJS 不太清楚,我怀疑是 macOS 和 Linux 下处理跨域不一样。
    你可以尝试在服务端加上 CORS ,然后再试试。
    nino
        6
    nino  
       2017-03-03 17:55:57 +08:00
    不需要,你可以改 PhantomJS 的安全性设置
    liuxu
        7
    liuxu  
       2017-03-03 18:04:27 +08:00
    服务端, php 返回时发送:
    header("Access-Control-Allow-Origin:*");
    HanningWu
        8
    HanningWu  
    OP
       2017-03-03 18:07:50 +08:00
    @liuxu 看了 3 楼才知道,我是请求端,这个 header 是服务端添加的。难怪我添加了没用。
    HanningWu
        9
    HanningWu  
    OP
       2017-03-03 18:08:28 +08:00
    @surfire91 我是请求端,我不能处理服务端。。怎么查看 macOS 和 Ubuntu 下的跨域设置呢?
    jiangzhuo
        10
    jiangzhuo  
       2017-03-03 18:09:29 +08:00
    @HanningWu --debug
    Pastsong
        11
    Pastsong  
       2017-03-03 18:10:29 +08:00
    jsonp
    HanningWu
        12
    HanningWu  
    OP
       2017-03-03 18:13:42 +08:00
    @surfire91 这个「跨域设置」是什么东西的属性?操作系统的属性还是浏览器的属性?我看 StackExchange 上很多人说如果使用 Chrome 调试出现这个 Cross-origin request not supported 错误,可以更改 Chrome 的跨域设置来解决。但是我用 PhantomJS 的话并不是什么浏览器啊。
    HanningWu
        13
    HanningWu  
    OP
       2017-03-03 18:13:53 +08:00
    @jiangzhuo phantomjs --debug ?
    jiangzhuo
        14
    jiangzhuo  
       2017-03-03 18:19:21 +08:00
    @HanningWu 在两个机器上都加上--debug=true 看看运行的各个参数是否都一样
    antowa
        15
    antowa  
       2017-03-03 18:44:31 +08:00
    Allow-Control-Allow-Origin:* ??
    HanningWu
        16
    HanningWu  
    OP
       2017-03-03 18:45:50 +08:00
    @antowa 看了 3 楼才知道,我是请求端,这个 header 是服务端那边添加的。我添加了没有用。
    HanningWu
        17
    HanningWu  
    OP
       2017-03-03 20:05:15 +08:00
    @jiangzhuo 我才知道 phantomjs 有--debug 这个选项,感谢。 ubuntu 下的 debug 内容的前 41 行内容与[macOS]( https://gist.github.com/patricorgi/44230f23d2c4352bcb4412c2d9abc057)完全一致,从 42 行之后的内容 ubuntu 就没有了,之后就是报错(该帖中提到的那两行错误)
    wly19960911
        18
    wly19960911  
       2017-03-03 20:08:41 +08:00 via Android
    跨域是服务器端的,请求方不能设置,没办法
    HanningWu
        19
    HanningWu  
    OP
       2017-03-03 20:25:59 +08:00
    @wly19960911 可是我在 macOS 下能用 phantomjs 跑这个 js 脚本, ubuntu 就不行。肯定是 PhantomJS 的设置问题。。
    dhssingle
        20
    dhssingle  
       2017-03-03 20:29:45 +08:00
    跨域看浏览器的
    HanningWu
        21
    HanningWu  
    OP
       2017-03-03 20:46:45 +08:00
    @dhssingle 可我用的是 phantomjs 不是浏览器,连 UserAgent 都没设置。
    aleen42
        22
    aleen42  
       2017-03-03 23:37:42 +08:00
    理论上来说, XHR 会受同源限制,不能进行跨域请求
    HanningWu
        23
    HanningWu  
    OP
       2017-03-04 01:55:19 +08:00
    @aleen42 macOS 下使用 phantomjs 的`--web-security=no`选项可以跨过同源限制。
    kingze1992
        24
    kingze1992  
       2017-03-04 09:21:21 +08:00
    试试这个
    http://stackoverflow.com/questions/12021578/phantomjs-failing-to-open-https-site
    --ignore-ssl-errors
    我感觉是 https 的原因
    surfire91
        25
    surfire91  
       2017-03-06 14:01:29 +08:00   ❤️ 1
    @HanningWu
    我拿了你 4 楼的代码试了下,可用。需要加 --web-security=no ,环境是 centos
    ./phantomjs --web-security=no /tmp/myfile.js
    surfire91
        26
    surfire91  
       2017-03-06 14:01:56 +08:00
    @HanningWu
    ./phantomjs -v
    2.1.1
    HanningWu
        27
    HanningWu  
    OP
       2017-03-06 14:33:14 +08:00 via iPhone
    @surfire91 这个 web security flag 我设置为 no 了,但在 ubuntu 下仍然给出相同的错误。 ubunu 系统是不是有毒啊!后来我放弃了 ubuntu ,重装了 windows 系统,然后用 cygwin 来跑 Linux shell 脚本。
    HanningWu
        28
    HanningWu  
    OP
       2017-03-06 14:34:48 +08:00 via iPhone
    @surfire91 我到 Linux StackExchange 问一下,也无人可解,不知道这是 Ubuntu 的原因还是 16.04 这一个版本原因,总之我放弃了。不过还是非常感谢你的帮助。
    HanningWu
        29
    HanningWu  
    OP
       2017-03-06 14:36:56 +08:00 via iPhone
    @kingze1992 这个 flag 我设置过,没有效果。
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   1118 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 26ms · UTC 18:41 · PVG 02:41 · LAX 10:41 · JFK 13:41
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.