3 votes

Nginx en tant que proxy de Nodejs (Dokku). Les en-têtes de réponse CORS ne passent pas

J'utilise Dokku pour héberger mon application chez DigitalOcean. Dokku exécuter nginx 1.6 pour proxyer des applications Docker simulant un environnement de type Heroku. Les applications partagent toutes des configurations par défaut similaires, comme ci-dessous.

Mon serveur Node.js utilise intergiciel CORS pour indiquer au navigateur d'autoriser www.myapp.com à faire des appels à api.myapp.com :

Cela fonctionne bien sur mon ordinateur local. Lorsque je le déploie, j'obtiens une erreur CORS dans le navigateur :

XMLHttpRequest cannot load https://api.myapp.com/r_u_up. No 'Access-Control-Allow-Origin' header is present on the requested resource. Origin 'https://www.myapp.com' is therefore not allowed access. The response had HTTP status code 502.

Donc, WTF, terminé.

J'ai trouvé ceci nginx CORS config mais ça semble très cruciforme. S'agit-il d'un vieux code ou de la meilleure méthode ? Ce site utilise cette configuration.

Je préférerais une configuration plus simple qui ne fait que transmettre les en-têtes de réponse. Mon application n'a pas besoin de nginx pour les intercepter. Comment puis-je configurer cela ?

App nginx.conf's :

upstream www { server 172.17.0.135:5000; }
server {
  listen      [::]:80;
  listen      80;
  server_name www.myapp.com ;
  return 301 https://www.myapp.com$request_uri;
}

server {
  listen      [::]:443 ssl spdy;
  listen      443 ssl spdy;
  server_name www.myapp.com;

  keepalive_timeout   70;
  add_header          Alternate-Protocol  443:npn-spdy/2;
  location    / {
    proxy_pass  http://www;
    proxy_http_version 1.1;
    proxy_set_header Upgrade $http_upgrade;
    proxy_set_header Connection upgrade;
    proxy_set_header Host $http_host;
    proxy_set_header X-Forwarded-Proto $scheme;
    proxy_set_header X-Forwarded-For $remote_addr;
    proxy_set_header X-Forwarded-Port $server_port;
    proxy_set_header X-Request-Start $msec;
  }
  include /home/dokku/www/nginx.conf.d/*.conf;
}

0 votes

0voto

Michael Cole Points 442

Mise à jour : il s'avère que CORS est une spécification zombifiée, et oui, faire cela avec une configuration nginx est la meilleure solution.

http://enable-cors.org/

La raison pour laquelle nginx est le meilleur moyen est que nginx est le processus le plus rapide et le plus proche du client.

Si nginx peut prendre en charge la demande sans toucher à votre application (node.js, php, Rails, etc.), votre application sera plus facile à adapter et fonctionnera plus rapidement.

1 votes

Pourquoi l'utilisation de la configuration de nginx est-elle la meilleure solution ?

SistemesEz.com

SystemesEZ est une communauté de sysadmins où vous pouvez résoudre vos problèmes et vos doutes. Vous pouvez consulter les questions des autres sysadmins, poser vos propres questions ou résoudre celles des autres.

Powered by:

X