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

2017-03-03 16:17:52 +08:00
 HanningWu

同样的 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 友能帮忙找一下原因。

4724 次点击
所在节点    JavaScript
29 条回复
momocraft
2017-03-03 16:51:55 +08:00
可以看一下 mdn 的 CORS 那页
surfire91
2017-03-03 17:10:19 +08:00
把 Request 和 Response 都贴下
ck65
2017-03-03 17:13:05 +08:00
Allow origin 头不是请求方加的,是响应方加的。如 1 楼看看 cors 文档或教程吧。
HanningWu
2017-03-03 17:38:51 +08:00
@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
2017-03-03 17:48:39 +08:00
PhantomJS 不太清楚,我怀疑是 macOS 和 Linux 下处理跨域不一样。
你可以尝试在服务端加上 CORS ,然后再试试。
nino
2017-03-03 17:55:57 +08:00
不需要,你可以改 PhantomJS 的安全性设置
liuxu
2017-03-03 18:04:27 +08:00
服务端, php 返回时发送:
header("Access-Control-Allow-Origin:*");
HanningWu
2017-03-03 18:07:50 +08:00
@liuxu 看了 3 楼才知道,我是请求端,这个 header 是服务端添加的。难怪我添加了没用。
HanningWu
2017-03-03 18:08:28 +08:00
@surfire91 我是请求端,我不能处理服务端。。怎么查看 macOS 和 Ubuntu 下的跨域设置呢?
jiangzhuo
2017-03-03 18:09:29 +08:00
@HanningWu --debug
Pastsong
2017-03-03 18:10:29 +08:00
jsonp
HanningWu
2017-03-03 18:13:42 +08:00
@surfire91 这个「跨域设置」是什么东西的属性?操作系统的属性还是浏览器的属性?我看 StackExchange 上很多人说如果使用 Chrome 调试出现这个 Cross-origin request not supported 错误,可以更改 Chrome 的跨域设置来解决。但是我用 PhantomJS 的话并不是什么浏览器啊。
HanningWu
2017-03-03 18:13:53 +08:00
@jiangzhuo phantomjs --debug ?
jiangzhuo
2017-03-03 18:19:21 +08:00
@HanningWu 在两个机器上都加上--debug=true 看看运行的各个参数是否都一样
antowa
2017-03-03 18:44:31 +08:00
Allow-Control-Allow-Origin:* ??
HanningWu
2017-03-03 18:45:50 +08:00
@antowa 看了 3 楼才知道,我是请求端,这个 header 是服务端那边添加的。我添加了没有用。
HanningWu
2017-03-03 20:05:15 +08:00
@jiangzhuo 我才知道 phantomjs 有--debug 这个选项,感谢。 ubuntu 下的 debug 内容的前 41 行内容与[macOS]( https://gist.github.com/patricorgi/44230f23d2c4352bcb4412c2d9abc057)完全一致,从 42 行之后的内容 ubuntu 就没有了,之后就是报错(该帖中提到的那两行错误)
wly19960911
2017-03-03 20:08:41 +08:00
跨域是服务器端的,请求方不能设置,没办法
HanningWu
2017-03-03 20:25:59 +08:00
@wly19960911 可是我在 macOS 下能用 phantomjs 跑这个 js 脚本, ubuntu 就不行。肯定是 PhantomJS 的设置问题。。
dhssingle
2017-03-03 20:29:45 +08:00
跨域看浏览器的

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/344666

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX