NGINX barre oblique dans le pass proxy url

je sais que cette question a été posée plusieurs fois, mais après un essayer beaucoup de solutions, je suis toujours bloqué.

j'utilise NginX pour passer par procuration à une application NodeJs. Je suis en train de faire de l'url https://example.com proxy passer la requête à http://example.com:8080/?

Demande (à partir d'une application mobile) demandent https://example.com// qui nginx est de faire http://example.com:8080//? ce qui ne fonctionne pas.

Choses que j'ai essayé qui n'ont pas fonctionné:

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

Ma config 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;
}
11
demandé sur notpeter 2014-03-31 14:34:10

2 réponses

je suppose que vous utilisez proxy_pass sans URI. Dans ce cas nginx passer URI original comme il a été, non normalisé un. Donc, vous devez utiliser proxy_pass http://backend/;

UPDATE

Donc, j'avais raison. Il suffit d'ajouter la partie 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 le NGINX documentation si proxy_pass utilisé sans URI (c.-à-d. sans chemin après serveur:port) nginx mettra URI de la requête originale exactement comme il était avec toutes les doubles slashes, ../ et ainsi de suite.

de L'autre côté, URI dansproxy_pass agit comme alias directive, signifie que nginx remplacera la partie qui correspond au préfixe de localisation (dans le cas où il est /a au premier emplacement et/a/ is second) avec URI en proxy_pass directive (que j'ai fait intentionnellement le même que le préfixe de localisation) donc URI sera le même que demandé mais normalisé (sans doubles slashes et tout ce personnel). attention avec élancements de queue. Nginx remplace la partie littéralement et vous pourriez finir avec une url étrange.

voici un exemple avec slash arrière dans location, but no traiilig slash in proxy_pass.

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

si on aller à l'adresse http://yourserver.com/one/path/here?param=1 nginx va proxy request to http://127.0.0.1/twopath/here?param=1. Voir comment two et path concatène.

11
répondu Alexey Ten 2014-03-31 11:51:27

Vous pouvez 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 mandataire 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 pourriez avoir besoin d'utiliser un autre navigateur pour tester la nouvelle configuration (éviter de cache)

0
répondu Dylan B 2018-07-06 05:22:52