XMLHttpRequest 跨域请求(Cross Origin Request)错误 - V2EX
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 5108 次点击
    这是一个创建于 3147 天前的主题,其中的信息可能已经有所发展或是发生改变。

    同样的 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 都贴下
    mogita
        3
    mogita  
       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', "", false); //这里用同步请求,不用异步
    request.send();
    if (request.status === "200") {
    console.log("Succeed!");
    } else {
    console.log("Failed!");
    }
    在 Ubuntu 系统终端下运行 phantomjs myfile.js 结果是两行错误
    XMLHttpRequest cannot load . 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     Solana     1525 人在线   最高记录 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 27ms UTC 16:36 PVG 00:36 LAX 09:36 JFK 12:36
    Do have faith in what you're doing.
    ubao snddm index pchome yahoo rakuten mypaper meadowduck bidyahoo youbao zxmzxm asda bnvcg cvbfg dfscv mmhjk xxddc yybgb zznbn ccubao uaitu acv GXCV ET GDG YH FG BCVB FJFH CBRE CBC GDG ET54 WRWR RWER WREW WRWER RWER SDG EW SF DSFSF fbbs ubao fhd dfg ewr dg df ewwr ewwr et ruyut utut dfg fgd gdfgt etg dfgt dfgd ert4 gd fgg wr 235 wer3 we vsdf sdf gdf ert xcv sdf rwer hfd dfg cvb rwf afb dfh jgh bmn lgh rty gfds cxv xcv xcs vdas fdf fgd cv sdf tert sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf shasha9178 shasha9178 shasha9178 shasha9178 shasha9178 liflif2 liflif2 liflif2 liflif2 liflif2 liblib3 liblib3 liblib3 liblib3 liblib3 zhazha444 zhazha444 zhazha444 zhazha444 zhazha444 dende5 dende denden denden2 denden21 fenfen9 fenf619 fen619 fenfe9 fe619 sdf sdf sdf sdf sdf zhazh90 zhazh0 zhaa50 zha90 zh590 zho zhoz zhozh zhozho zhozho2 lislis lls95 lili95 lils5 liss9 sdf0ty987 sdft876 sdft9876 sdf09876 sd0t9876 sdf0ty98 sdf0976 sdf0ty986 sdf0ty96 sdf0t76 sdf0876 df0ty98 sf0t876 sd0ty76 sdy76 sdf76 sdf0t76 sdf0ty9 sdf0ty98 sdf0ty987 sdf0ty98 sdf6676 sdf876 sd876 sd876 sdf6 sdf6 sdf9876 sdf0t sdf06 sdf0ty9776 sdf0ty9776 sdf0ty76 sdf8876 sdf0t sd6 sdf06 s688876 sd688 sdf86