Aktivieren Cors auf node.js app mit nginx-proxy
Ich habe ein digital ocean Droplets, die eine reverse-proxy-server mit nginx und Knoten. Ich habe dieses tutorial von digital ocean als Ausgangspunkt
Habe ich auch eingerichtet mit ssl verschlüsseln können. Das Problem bin ich derzeit habe ist, dass ich unfähig bin, um cross-domain-ajax-Aufrufe an den server. Ich bin immer eine Fehlermeldung Kein 'Access-Control-Allow-Origin' - header vorhanden ist. Ich habe die entsprechenden header-Antwort in mein node-app und haben versucht zu Folgen, die wenigen Beispiele, die ich finden konnte für nginx mit kein Glück. Unten ist mein code.
nginx mit meinen versuchen im Header entfernt
server {
listen 443 ssl;
server_name lefthookservices.com www.lefthookservices.com;
ssl_certificate /etc/letsencrypt/live/lefthookservices.com/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/lefthookservices.com/privkey.pem;
ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
ssl_prefer_server_ciphers on;
ssl_dhparam /etc/ssl/certs/dhparam.pem;
ssl_ciphers 'ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-AES256-GCM-$
ssl_session_timeout 1d;
ssl_session_cache shared:SSL:50m;
ssl_stapling on;
ssl_stapling_verify on;
add_header Strict-Transport-Security max-age=15768000;
location / {
proxy_pass http://127.0.0.1:8080;
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection 'upgrade';
proxy_set_header Host $host;
proxy_cache_bypass $http_upgrade;
}
location ~ /.well-known {
allow all;
}
}
server {
listen 80;
server_name lefthookservices.com www.lefthookservices.com;
return 301 https://$host$request_uri;
}
Hier ist meine app.js Skript express
'use strict';
var colors = require('colors/safe');
var express = require('express');
var knack = require('./knack_call.js');
var bodyParser = require('body-parser');
var cors = require('cors');
colors.setTheme({
custom: ['blue', 'bgWhite']
});
var app = express();
app.use(bodyParser.json());
//allow for cross domain ajax
app.get('/', function(request, response){
response.send('hello\n');
});
app.post('/', function(request, response){
response.header("Access-Control-Allow-Origin", "*");
response.header("Access-Control-Allow-Headers", "X-Requested-With");
response.header("Access-Control-Allow-Methods', 'GET,POST");
knack.getData(request, response);
});
app.listen(8080, '127.0.0.1', function(m){
console.log(colors.custom("Captin the server is at full strength"));
});
Jede Anregung, die mir helfen könnten die richtigen Header zu ermöglichen CORS würde sehr geschätzt werden. Vielen Dank im Voraus.
Als Ergebnis von Tristans Antwort unter meine Nginx-code sieht nun wie folgt aus.
server {
listen 443 ssl;
server_name lefthookservices.com www.lefthookservices.com;
ssl_certificate /etc/letsencrypt/live/lefthookservices.com/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/lefthookservices.com/privkey.pem;
ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
ssl_prefer_server_ciphers on;
ssl_dhparam /etc/ssl/certs/dhparam.pem;
ssl_ciphers 'ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-AES256-GCM-SHA384:DHE-RSA-AES128-GCM-SHA256:DHE-DSS-AES128-GCM-SHA256:kEDH+AESGCM:ECDHE-RSA-AES$
ssl_session_timeout 1d;
ssl_session_cache shared:SSL:50m;
ssl_stapling on;
ssl_stapling_verify on;
add_header Strict-Transport-Security max-age=15768000;
location / {
proxy_redirect off;
proxy_set_header Host $host;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
if ($http_origin ~*(https?://.*\exponential.singularityu\.org(:[0-9]+)?$)){
set $cors "1";
}
if ($request_method = 'OPTIONS') {
set $cors "${cors}o";
}
if ($cors = "1") {
more_set_headers 'Access-Control-Allow-Origin: $http_origin';
more_set_headers 'Access-Control-Allow-Credentials: true';
proxy_pass http://127.0.0.1:8080;
}
if ($cors = "1o") {
more_set_headers 'Access-Control-Allow-Origin: $http_origin';
more_set_headers 'Access-Control-Allow-Methods: GET, POST, OPTIONS, PUT, DELETE';
more_set_headers 'Access-Control-Allow-Credentials: true';
more_set_headers 'Access-Control-Allow-Headers: Origin,Content-Type,Accept';
add_header Content-Length 0;
add_header Content-Type text/plain;
return 204;
}
proxy_pass http://127.0.0.1:8080;
}
}
location ~ /.well-known {
allow all;
}
}
Leider ist dies immer noch nicht funktioniert.
server {
listen 80;
server_name lefthookservices.com www.lefthookservices.com;
return 301 https://$host$request_uri;
}
Du musst angemeldet sein, um einen Kommentar abzugeben.
Es stellt sich heraus, die Fehlermeldung war ich immer zu ungenau war. Das Problem war nicht die header-Einstellung. Es stellte sich heraus, dass ich brauchte, um die Anfrage mit jsonp und ich brauchte, um zu verarbeiten die eingehenden Daten unterschiedlich. Ein Fehler in der Funktion, die aufgerufen wird, indem app.js war erroring, wodurch die Verbindung um die Zeit aus. Dies führte in den entsprechenden Header nicht an den browser zurückgegeben, die die Fehlermeldung verursacht.
Für alle, in der Hoffnung zu finden ein NGINX config das klappte dies ist meine.
Dank Euch für die Vorschläge.
Ziehen Nginx aus dieser Gleichung. Es hat nichts zu tun mit dem CORs-problem sein, wenn Ihr setup ist so wie meiner, wie ich glaube, es ist. Ich sehe, dass Sie über die
cors
Modul, aber du bist nicht wirklich mit, dass ich sehen kann.Ihre Einstellungen sind einfach genug, dass Sie vielleicht in der Lage sein, um Weg mit den Standardwerten, also rechts unten
app.use(bodyParser.json());
aktualisieren Sie Ihrenapp.js
mit:Könnte direkt aus der box. Wenn es nicht funktioniert, können Sie eine Reihe von Optionen. Meins sieht ungefähr so aus:
Anderen config-Optionen sind verfügbar in der Dokumentation.
Du bist fast da.
Haben Sie zu denken, den proxy als einen externen server, sowie Ihre Node.js -Anwendung.
So, in kurzen, müssen Sie einen header hinzufügen, um Ihre nginx Konfiguration.
Werfen Sie einen Blick auf diesen link,
https://gist.github.com/pauloricardomg/7084524
In diesem Fall immer gelöscht wird: