【发布时间】:2015-04-04 01:39:40
【问题描述】:
我在通过 Socket.io 从 localhost 连接到 Nodejitsu 的远程服务器时遇到了跨域问题。我收到一个错误“...标头包含多个值 'http://evil.com/, *',但只允许一个”。更多详情如下:
我有一个在 Nodejistu 上运行的 Express/Mongoose/Socket.io 应用程序,用作 REST API,它不提供 HTML 文件。
在本地,我有一个 Angularjs+Requirejs 应用程序(在 http://localhost:8000 运行)尝试连接到远程 API,但我无法访问。虽然我可以使用 POSTMAN 测试 API 方法并且能够从 Angular RequireJS 应用程序读取 socket.io 脚本前端,但连接未被授予访问权限并导致服务器崩溃循环。
在 Nodejitsu 上的 NodeJS/Express 应用程序中,我设置了以下内容:
var express = require('express');
var app = express();
var bodyParser = require('body-parser');
var morgan = require('morgan');
var port = process.env.PORT || 80; // set our port the same as Nodejitsu
// ATTACHING SOCKET.IO
var server = require('http').createServer(app);
var io = require('socket.io')(server);
app.set('socketio', io); // socket instance of the app
app.set('server', server);
// CONFIGURE BODY PARSER
app.use(bodyParser.urlencoded({ extended: true }));
app.use(bodyParser.json());
//CORS SETTING
app.use(function(req, res, next) {
res.header("Access-Control-Allow-Origin", "http://localhost:8000");
res.header("Access-Control-Allow-Methods", "GET,PUT,POST,DELETE,OPTIONS");
res.header("Access-Control-Allow-Headers", "Origin, X-Requested-With, Content-Type, Accept");
res.header("Access-Control-Allow-Credentials", "false");
next();
});
// START SERVER
app.get('server').listen(port);
---------
// package.json
"dependencies": {
"express": "4.11.1",
"morgan": "1.5.1",
"mongoose": "3.8.21",
"body-parser": "1.10.2",
"grunt-release": "0.10.0",
"socket.io": "1.3.2"
},
在 localhost:8000 上的 Angular 应用程序中,我检查了 Header 是否重复,如附件 png 所示。
// main.js
"use strict";
require.config({
paths: {
...
'socketio': 'http://<MYAPP>.jit.su/socket.io/socket.io';,
...
// SocketFactory.js
var socket = io.connect('http://<MYAPP>.jit.su:80/api/boards');
但是,即使我将 Origin 设置为 localhost://8000,我也会收到此错误消息:
XMLHttpRequest cannot load http://<MYAPP>.jit.su/socket.io/?EIO=3&transport=polling&t=1423052553506-7.
The 'Access-Control-Allow-Origin' header contains multiple values
'http://evil.com/, *', but only one is allowed.
Origin 'http://localhost:8000'; is therefore not allowed access.
【问题讨论】:
-
听起来像一个类似的问题/答案:stackoverflow.com/questions/22343384/… 和 stackoverflow.com/questions/27351688/…。听起来当某些与 CORS 相关的标头重复时会发生此错误。您应该仔细检查请求和响应的标头,看看是否有重复。
-
您可以阅读许多类似的问题/答案here。
-
您好,感谢您的回复@jfriend00!我用关于我的问题的更多细节更新了我的问题。我看不到 Access-Control-Allow-Origin 被复制,但我在 Express 中将其设置为特定于 Localhost:8000。但是,在 Chrome 中,它显示为 evil.com。
标签: websocket socket.io cross-domain nodejitsu