2014-08-29 5 views
5

Ich habe Cross Domain-Konfigurationsprobleme mit Nginx und Segeln. Das Problem ist, dass , wenn ich den Socket richtig über http://domain-server.com/socket.io/ verbinden dann die RESTful Anfrage wird fehlschlagen. Wenn RESTful funktioniert, wird der Socket nicht funktionieren.Cross-Domain-Konfiguration Probleme mit Nginx, Segel und Emporkömmling

Setup-

Kunde http://domain.com

Server http://server-domain.com

Client ist eine Winkel Anwendung "sails.io.js": "0.10.3" und diese Config io.sails.url = 'http://domain-server.com'; verwenden.

Server ist eine Segelanwendung mit RESTful Request- und Socket-Funktionen.

Sails CORS Config

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' 
}; 

Sails Buchse Config

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

nginx Config

kommentiert heraus sind, was ich mit der nginx Konfiguration getüftelt haben, ohne viel Erfolg (auch t ried die Client-Adresse statt *).

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; 
    } 
} 

AngularJS Service-Methode, die RESTful Anrufen

function query(path, attributes) { 

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

In der Winkelkonfigurationsfunktion

$httpProvider.defaults.useXDomain = true; 

Es ist die aktuelle Konfiguration und hier sind die Ergebnisse, die ich erlebe .

Browser Konsolausgabe

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

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

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. - Nicht gut

UPDATE

Es scheint, wie alles funktioniert Wunder, wenn ich Segel direkt mit sails lift oder node app.js starte noch beim Starten mit dem Upstart-Skript in einer .conf Datei das Cross-Domain-Problem auftritt.

Emporkömmling Skript

#!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 
+0

Wo ist das gehostet? Bestimmte Cloud-Hosts (wie OpenStack) scheinen das Senden von CORS-Headern zu blockieren. – sgress454

+0

Ich kann die CORS für RESTful gut funktionieren, es nur, wenn sie die socket.io Seite der Sache nicht mehr funktionieren. Klingt, als gäbe es irgendwo einen Konflikt. – GillesC

+0

Was bekommen Sie, wenn Sie im Browser zu http: //domain-server.com/login? Password = test & username = test? Navigieren? Ist es eine Nginx-Fehlerseite? Sind Reverse-Proxy-Anforderungen ordnungsgemäß von Nginx auf die Segel-Anwendung? Oder sind sie auf verschiedenen Häfen? – david

Antwort

1

Versuchen, den folgenden an die Spitze Ihrer Segel App app.js Datei:

process.chdir(__dirname); 

Die not found Sie sehen, ist wahrscheinlich die Standardeinstellung Express 404-Nachricht. Wenn Sie versuchen, eine Sails-App außerhalb des eigenen Verzeichnisses anzuheben, werden die API-Dateien (z. B. Controller) nicht ordnungsgemäß geladen. Die process.chdir wurde zu dem Standard app.js irgendwann hinzugefügt, um dieses Problem zu verhindern, aber es sieht so aus, als ob es irgendwo auf dem Weg eine Regression gab.