Https Nginx NodeJS SocketIO和CORS请求失败
Https Nginx NodeJS SocketIO And CORS request failed
我的问题是,
上下文:
我有一个NGinx服务器工作。NGinx使用证书来启用HTTPS。那就没问题了。
我有一个NodeJS服务器工作,这只是应该处理websockets,使用socketIO。
我正在测试Mozilla Firefox(这可能不是最好的事情…)
App首先在HTTP上运行,一切都运行良好。现在,所有切换到HTTPS,我面临一个"跨源"的问题。
我已经尝试了几种解决方案,但它们都不适合我…我将在文章的最后解释我的尝试。
首先,让我给你看一下相关的文件,server.js用于nodeJS, NGinx .conf用于NGinx服务器,"client script"用于连接websocket。
server.js - NodeJS
var app = require('express')();
var fs = require('fs');
var https = require('https');
var _ = require('underscore');
var socketio = require('socket.io');
var options = {
key: fs.readFileSync('/ssl/file.key'),
cert: fs.readFileSync('/ssl/file.crt')
};
var server = https.createServer(options).listen(9001,function(){
console.log("SERVER LISTENING");
});
io = socketio.listen(server,{origins:'*:*'});
var connectedSockets = {};
_.each(io.nsps, function(nsp){
nsp.on('connect', function(socket){
if (!socket.auth) {
delete nsp.connected[socket.id];
}
});
});
function checkAuthToken(token,callback){
callback(null,true);
}
io.on('connection',function(socket){
socket.broadcast.emit('hi');
socket.on('disconnect',function(){
console.log('a user disconnected');
});
socket.on('chat message',function(msg){
io.emit('chat message',msg);
});
socket.on('authenticate', function(data){
checkAuthToken(data.token, function(err, success){
if (!err && success){
socket.auth = true;
_.each(io.nsps, function(nsp) {
if(_.findWhere(nsp.sockets, {id: socket.id})) {
nsp.connected[socket.id] = socket;
}
});
}
});
});
});
这是一个"简单"的聊天应用程序,需要完成一些事情,例如应该检查身份验证的脚本…
NGinx .conf - NGinx Server Config
worker_processes 1;
events {
worker_connections 1024;
}
http {
include mime.types;
default_type application/octet-stream;
map $http_upgrade $connection_upgragde {
default upgrade;
'' close;
}
sendfile on;
server {
listen 80;
server_name 192.168.100.22;
rewrite ^ https://$http_host$request_uri? permanent;
}
server {
listen 443;
ssl on;
ssl_certificate /ssl/file.crt;
ssl_certificate_key /ssl/file.key;
server_name 192.168.100.22;
root E:/www;
index index.php index.html index.htm;
add_header Access-Control-Allow-Origin *;
add_header Strict-Transport-Security "max-age=31536000; includeSubdomains";
proxy_set_header X-Forwarded-For $remote_addr;
server_tokens off;
charset utf-8;
error_page 500 502 503 504 /50x.html;
location ~ '.php$ {
try_files $uri =404;
include /Nginx/nginx-1.8.0/conf/fastcgi_params;
fastcgi_param HTTPS on;
fastcgi_param HTTP_SCHEME https;
fastcgi_split_path_info ^(.+'.php)(.*)$;
fastcgi_pass 127.0.0.1:9000;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
}
}
}
Client.js - index.php中的连接脚本
<script src="./jquery-1.11.1.js"></script>
<script src="./socket.io-1.3.5.js"></script>
<script>
var socket = io('wss://192.168.100.22:9001');
$("form").submit(function(){
socket.emit('chat message',$('#m').val());
$('#m').val('');
return false;
});
socket.on('connect', function(){
socket.emit('authenticate', {token: 456456456,rights:'any'});
});
socket.on('chat message', function(msg){
$('#messages').append($('<li>').text(msg));
});
socket.on('hi',function(){
$('#messages').append($('<li>').text('connection'));
});
</script>
服务器位于192.168.100.22 IP
Nginx监听80 &将所有流量重定向到443 (https)
通过nginx访问文件夹是ok的,当前的聊天测试位于192.168.100.22/websocks/index.php
错误信息如下:
GET https://192.168.100.22:9001/socket.io/?EIO=3&transport=polling&t=1432131062725-0 Cross-Origin Request Blocked: The Same Origin Policy disallows reading the remote resource at https://192.168.100.22:9001/socket.io/?EIO=3&transport=polling&t=1432131062725-0. Reason: CORS request failed
实际上,我已经尝试将此添加到nodejs脚本:
https.globalAgent.options.rejectUnauthorized = false;
app.get('*',function(req,res,next){
res.header("Access-Control-Allow-Origin","*");
res.header("Access-Control-Allow-Headers","X-Requested-With");
next();
});
But Nothing worked yet.
感谢阅读/帮助
验证您的SSL证书是有效的,并且名称与您的域匹配。看起来您正在使用IP地址而不是证书的域名。当Firefox抱怨证书时,我看到了CORS错误。
相关文章:
- 向localhost发出带有grunt的代理CORS请求
- Node.js cors请求-异步示例不起作用
- 是 CORS 请求,预检耗时
- Pingfederate opentoken模块CORS请求返回302,而不是200
- 在JQuery中启用CORS后,CORS请求被阻止
- 从CORS请求中捕获异步异常
- 无法在 jquery 中获取 Ajax CORS 请求以工作
- 将 CORS 请求发布到运行 sailsjs 的 HTTPS 域
- 授权标头仅在 AJAX CORS 请求中追加一次
- 使用 jQuery 的 CORS 请求 - $.ajax()
- 尝试处理 CORS 请求时出现 ParseError
- Firefox 不允许 CORS 请求,即使服务器返回了相应的响应标头
- CORS 请求与 Safari 一起工作
- IE11未启动CORS请求
- Safari阻止对Express API的CORS请求
- AngularJS不允许CORS请求
- CORS请求处于反应状态
- 为什么此CORS请求失败
- CORS请求结构很难理解,你能帮我解释一下吗
- 如何使用XMLHttpRequest发出CORS请求