Quiero redirigir una URL, por ejemplo, dominio.com/api/ a un servidor Node.js específico, la URL raíz muestra mi sitio web. En este momento uso esta configuración:

server {
        listen 80 default_server;
        listen [::]:80 default_server;

        root /var/www/html;

        server_name _;

        location / {

                try_files $uri $uri/ =404;
        }

        location /api {
            proxy_set_header X-Real-IP $remote_addr;
            proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
            proxy_set_header X-NginX-Proxy true;
            proxy_pass http://localhost:3031/;
            proxy_ssl_session_reuse off;
            proxy_set_header Host $http_host;
            proxy_cache_bypass $http_upgrade;
            proxy_redirect off;
}

Pero no funciona.

¿Qué ha salido mal?

Gracias por la ayuda y un saludo :)

1
Growing Dev 22 abr. 2020 a las 04:40

2 respuestas

Olvidó cerrar el corchete después de la sección ubicación / api. Tu configuración trabajando en mi máquina.

server {
    listen 80 default_server;
    listen [::]:80 default_server;

    root /var/www/html;

    server_name _;

    location / {

            try_files $uri $uri/ =404;
    }

    location /api {
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header X-NginX-Proxy true;
        proxy_pass http://localhost:3031/;
        proxy_ssl_session_reuse off;
        proxy_set_header Host $http_host;
        proxy_cache_bypass $http_upgrade;
        proxy_redirect off;
     }
  }

Además, su backend de nodejs debe manejar las solicitudes '/ api'.

0
Aleksey Druzhinin 22 abr. 2020 a las 06:06

Tenga en cuenta que la directiva proxy_pass obtiene argumentos para el backend y el URI opcional .

Eso significa que proxy_pass http://localhost:3031; obtendrá el URI del usuario, por ejemplo, /api/res.json, por lo que la URL final para el NODE JS es: http://localhost:3031/api/res.json

Pero cuando proporciona el URI a la directiva en sí, anula el URI solicitado en la ubicación coincidente . por ejemplo, location /api y proxy_pass http://localhost:3031/; (tenga en cuenta la barra inclinada). entonces la parte /api se reemplaza por / y la URL final es: http://localhost:3031/res.json.

De los documentos de NGINX:

Si la directiva proxy_pass se especifica con un URI, cuando se pasa una solicitud al servidor, la parte de un URI de solicitud normalizada que coincide con la ubicación se reemplaza por un URI especificado en la directiva:

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

Por lo tanto, es importante comprender que la parte del URI solicitado /name/ se reemplaza por /remote/ y luego el resto del URI solicitado se agrega al URI enviado final.

0
JonnieJS 22 abr. 2020 a las 06:14