web-dev-qa-db-fra.com

NginX barre oblique finale dans l'URL du proxy

Je sais que cette question a été posée à plusieurs reprises mais après avoir essayé beaucoup de solutions, je suis toujours bloquée.

J'utilise NginX pour passer par proxy à une application NodeJs. J'essaie de faire en sorte que le proxy url https://example.com transmette la demande à http://example.com:8080/?

Les demandes (depuis une application mobile) demandent https://example.com// lequel nginx est en train de créer http://example.com:8080//? qui ne fonctionne pas.

Ce que j'ai essayé et qui n'a pas fonctionné:

  • merge_slashes on; (activé par défaut)
  • rewrite ^/(.*)/$ /$1 permanent;
  • port_in_redirect off;

Ma configuration nginx:

location = /a {
    proxy_pass http://127.0.0.1:8080;
    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    proxy_set_header X-Real-IP $remote_addr;
    proxy_read_timeout 300;
}

location ^~ /a/ {
    proxy_pass http://127.0.0.1:8080;
    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    proxy_set_header X-Real-IP $remote_addr;
    proxy_read_timeout 300;
}
13
Pratyay Modi

Je suppose que vous utilisez proxy_pass sans URI. Dans ce cas, nginx transmet l’URI d’origine tel qu’il était, pas normalisé. Donc, vous devriez utiliser proxy_pass http://backend/;

METTRE À JOUR

Donc j'avais raison. Ajoutez simplement une partie d'URI à proxy_pass comme ceci:

location = /a {
    proxy_pass http://127.0.0.1:8080/a;
    ...
}

location ^~ /a/ {
    proxy_pass http://127.0.0.1:8080/a/;
    ...
}

Comme indiqué dans documentation de nginx if proxy_pass utilisé sans URI (c'est-à-dire sans chemin après serveur: port), nginx mettra l'URI de la requête d'origine exactement comme il était avec toutes les doubles barres obliques, ../ et ainsi de suite.

De l'autre côté, l'URI dans proxy_pass agit comme alias directive, signifie que nginx remplacera la partie qui correspond au préfixe d'emplacement (dans le cas où c'est /a au premier emplacement et /a/ est au second) avec l'URI dans la directive proxy_pass (que j'ai intentionnellement faite le même que le préfixe de localisation) donc l'URI sera le même que celui demandé mais normalisé (sans double barre oblique et tout ce personnel). Faites attention avec des barres obliques. Nginx remplace littéralement une partie et vous pourriez vous retrouver avec une URL étrange.

Voici un exemple avec une barre oblique finale dans location, mais pas de barre oblique finale dans proxy_pass.

location /one/ {
    proxy_pass http://127.0.0.1:8080/two;
    ...
}

si on va à l'adresse http://yourserver.com/one/path/here?param=1, nginx fera une requête proxy à http://127.0.0.1/twopath/here?param=1. Voyez comment two et path concaténent.

19
Alexey Ten

Vous pourriez ajouter ces lignes:

proxy_redirect off;
proxy_set_header Host $http_Host;
proxy_set_header X-Forwarded-Host $http_Host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;

Exemple, je proxy le port public 80 au port local 880

location / {
            proxy_redirect off;
            proxy_set_header Host $http_Host;
            proxy_set_header X-Forwarded-Host $http_Host;
            proxy_set_header X-Real-IP $remote_addr;
            proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
            proxy_connect_timeout 90;
            proxy_send_timeout 90;
            proxy_read_timeout 90;
            proxy_buffer_size 16k;
            proxy_buffers 32 8k;
            proxy_busy_buffers_size 64k;

            proxy_pass   http://127.0.0.1:880/;
    }

Remarque: Assurez-vous de redémarrer nginx. Vous devrez peut-être utiliser un autre navigateur pour tester la nouvelle configuration (éviter le cache)

0
Dylan B