2 votes

L'application Node.js ne se charge pas lorsque le chemin de localisation n'est pas /

Pour une raison quelconque, mon application Node.js s'exécutant sur 127.0.0.1:8081 nécessite /.

Si je commence avec ceci, À LA FOIS / et /projectb sont capables de charger la page.

server {
        listen 80;

        location / {
                proxy_pass http://127.0.0.1:8081;

                proxy_http_version 1.1;
                proxy_set_header Upgrade $http_upgrade;
                proxy_set_header Connection "upgrade";
        }

        location /projectb {
                proxy_pass http://127.0.0.1:8081/;

                proxy_http_version 1.1;
                proxy_set_header Upgrade $http_upgrade;
                proxy_set_header Connection "upgrade";
        }
}

Quand je le change à ceci, /projectb n'est plus capable de charger pleinement la page. Quand je regarde l'onglet réseau, certaines (mais pas toutes) requêtes échouent, par exemple certaines images, .js, certains mauvais endpoints.

server {
        listen 80;

        location /somethingelse {
                proxy_pass http://127.0.0.1:8080/;

                proxy_http_version 1.1;
                proxy_set_header Upgrade $http_upgrade;
                proxy_set_header Connection "upgrade";
        }

        location /projectb {  # Je m'attendrais à ce que cela fonctionne toujours.
                proxy_pass http://127.0.0.1:8081/;

                proxy_http_version 1.1;
                proxy_set_header Upgrade $http_upgrade;
                proxy_set_header Connection "upgrade";
        }
}

En résumé, cela fonctionne lorsque j'accède directement au port 123.456.78.910:8081, et lorsque J'AI À LA FOIS les / et /projectb qui pointent vers http://127.0.0.1:8081/, mais pas quand je pointe seulement vers /projectb.

Pourquoi cela pourrait-il être le cas?

0voto

hjpotter92 Points 640

De docs de nginx sur proxy_pass:

Si la directive proxy_pass est spécifiée avec une URI, alors lorsqu'une requête est passée au serveur, la partie d'une URI de requête normalisée correspondant à l'emplacement est remplacée par une URI spécifiée dans la directive :

location /nom/ {
    proxy_pass http://127.0.0.1/remote/;
}

Si proxy_pass est spécifié sans une URI, l'URI de requête est passée au serveur sous la même forme que celle envoyée par un client lorsque la requête originale est traitée, ou l'URI de requête normalisée complète est passée lors du traitement de l'URI modifiée :

location /quelque/chose/ {
    proxy_pass http://127.0.0.1;
}

Dans vos 2 exemples, le dernier fournit une URI (terminant par / dans l'URL), ce qui normalise l'URI, ce qui pourrait faire échouer les liens relatifs dans les fichiers js/css. Supprimez le / :

server {
        listen 80;

        location /autrechose {
                proxy_pass http://127.0.0.1:8080;

                proxy_http_version 1.1;
                proxy_set_header Upgrade $http_upgrade;
                proxy_set_header Connection "upgrade";
        }

        location /projetb {
                proxy_pass http://127.0.0.1:8081;

                proxy_http_version 1.1;
                proxy_set_header Upgrade $http_upgrade;
                proxy_set_header Connection "upgrade";
        }
}

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