使用nginx,sails和upstart进行跨域配置问题

Gil*_*esC 5 nginx upstart angularjs sails.js sails.io.js

我使用nginx和sails有跨域配置问题.问题是,如果我通过适当的方式连接套接字,http://domain-server.com/socket.io/ 则RESTful请求将失败.如果RESTful工作,套接字将不会.

建立

客户 http://domain.com

服务器 http://server-domain.com

客户端是使用"sails.io.js": "0.10.3"和配置的角度应用程序io.sails.url = 'http://domain-server.com';.

Server是一个具有RESTful请求和套接字功能的sails应用程序.

Sails CORS配置

module.exports.cors = {
    allRoutes: true,
    origin: 'http://domain.com',
    credentials: true,
    methods: 'GET, POST, PUT, DELETE, OPTIONS, HEAD',
    headers: 'content-type,Access-Control-Allow-Origin'
};
Run Code Online (Sandbox Code Playgroud)

Sails套接字配置

module.exports.socket {
    onConnect: function() {},
    onDisconnect: function() {},
    authorization: false,
    'backwardsCompatibilityFor0.9SocketClients': false,
    grant3rdPartyCookie: true,
    origins: 'http://domain.com'
};
Run Code Online (Sandbox Code Playgroud)

nginx配置

注释掉是我在nginx配置中摆弄的但没有取得多大成功(也尝试了客户端地址而不是*).

server {
    listen 80;

    server_name domain-server.com;
#add_header Access-Control-Allow-Origin *;
    location / {
#       add_header Access-Control-Allow-Origin *;

        proxy_pass http://localhost:1337;
        proxy_http_version 1.1;
        proxy_set_header Upgrade $http_upgrade;
        proxy_set_header Connection 'upgrade';
        proxy_set_header Host $host;
#        proxy_set_header Access-Control-Allow-Origin *;
        proxy_cache_bypass $http_upgrade;
   }
}
Run Code Online (Sandbox Code Playgroud)

进行RESTful调用的angularjs服务方法

function query(path, attributes) {

    return $http({
        url: domain + path,
        params: attributes,
        method: "GET",
        widthCredentials: true
    });
}
Run Code Online (Sandbox Code Playgroud)

在角度配置功能

$httpProvider.defaults.useXDomain = true;
Run Code Online (Sandbox Code Playgroud)

这是当前的配置,这是我遇到的结果.

浏览器控制台输出

Resource interpreted as Script but transferred with MIME type text/html: "http://domain-server.com/__getcookie". - 很好

|>
\___/ sails.io.js:200 io.socket connected successfully.
- 很好

XMLHttpRequest cannot load http://domain-server.com/login?password=test&username=test. No 'Access-Control-Allow-Origin' header is present on the requested resource. Origin 'http://domain.com' is therefore not allowed access. - 不好

UPDATE

如果我直接使用sails lift或者node app.js在使用.conf文件中的upstart脚本启动它时发生跨域问题,似乎一切都有用.

新贵脚本

#!upstart
description "demo"
author "gillesc"

start on (local-filesystems and net-device-up IFACE=eth0)
stop on shutdown

respawn
respawn limit 5 60

script
  exec /usr/bin/node /var/www/apps/domain-server.com/app.js > /var/www/apps/domain-server.com/server.log 2>&1
end script
Run Code Online (Sandbox Code Playgroud)

sgr*_*454 1

尝试将以下内容添加到 Sails 应用程序的app.js文件的顶部:

process.chdir(__dirname);
Run Code Online (Sandbox Code Playgroud)

not found看到的可能是默认的 Express 404 消息。如果您尝试将 Sails 应用程序提升到其自己的目录之外,则 API 文件(例如控制器)将无法正确加载。在某个时候将其process.chdir添加到默认的app.js中以防止此问题,但看起来在此过程中的某个地方出现了回归。