Puncte:1

Nginx proxy_redirect cu căi relative

drapel gq

Nu sunt un mare specialist în administrarea nginx, sunt doar un dezvoltator. Am două backend-uri care rulează în docker. Lasă-mă să le numesc

  • backend1:8080
  • backend2:8081

De asemenea, am Nginx care expune portul 443 cu certificatul Letsencrypt instalat. Configurația mea pentru Nginx este (variabila env FQDN este ceva de genul example.com)

backend în amonte1 {
  server backend1:8080;
}

backend în amonte2 {
  server backend2:8081;
}

Server {
  asculta 443 ssl;
  
  nume_server ${FQDN} www.${FQDN};
  
  ssl_certificate /etc/letsencrypt/live/${FQDN}/fullchain.pem;
  ssl_certificate_key /etc/letsencrypt/live/${FQDN}/privkey.pem;
  ssl_session_cache shared:SSL:1m;
  ssl_session_timeout 5m;
  ssl_ciphers HIGH:!aNULL:!MD5;
  ssl_prefer_server_ciphers activat;

  if ($server_port = 80) { set $https_redirect 1; }
  if ($gazdă ~ '^www\.') { setează $https_redirect 1; }
  if ($https_redirect = 1) { return 301 https://${FQDN}$request_uri; }
  
  locație /cale1/ {
    
    proxy_pass http://backend1/;

    proxy_redirect ~^/(.*) $scheme://$http_host/path1/$1;
    
    proxy_http_versiunea 1.1;
    
    proxy_pass_header Set-Cookie;
    cookie_pass_header proxy;
    proxy_pass_header X-Forwarded-For;

    proxy_set_header Actualizare $http_upgrade;
    proxy_set_header Conexiune „upgrade”;
    proxy_set_header Gazdă $http_host;
    proxy_set_header X-Real-IP $adresă_la distanță;
    proxy_set_header X-Forward-For $proxy_add_x_forwarded_for;
    proxy_set_header X-Forward-Proto http;
    proxy_set_header X-Nginx-Proxy adevărat;
    add_header X-Upstream $upstream_addr;
  }
  
  locație /cale2/ {
    
    proxy_pass http://backend2/;

    proxy_redirect ~^/(.*) $scheme://$http_host/path2/$1;
    
    proxy_http_versiunea 1.1;
    
    proxy_pass_header Set-Cookie;
    cookie_pass_header proxy;
    proxy_pass_header X-Forwarded-For;

    proxy_set_header Actualizare $http_upgrade;
    proxy_set_header Conexiune „upgrade”;
    proxy_set_header Gazdă $http_host;
    proxy_set_header X-Real-IP $adresă_la distanță;
    proxy_set_header X-Forward-For $proxy_add_x_forwarded_for;
    proxy_set_header X-Forward-Proto http;
    proxy_set_header X-Nginx-Proxy adevărat;
    add_header X-Upstream $upstream_addr;
  }
}

Vreau asta dacă cer https://exapmle.com/path1/ atunci Nginx ar trebui să meargă la http://backend1:8080/ și returnați-mi răspunsul de la acel server. Problema este că backend1 (precum și backend2) poate răspunde cu 302 și redirecționează către o cale de ex. /Autentificare. Nginx îmi redirecționează browserul către https://exapmle.com/login dar vreau să mă redirecționeze către https://exapmle.com/path1/login Ați putea să mă ajutați, vă rog, și să indicați eroarea pe care am făcut-o în configurația mea. Am revizuit toate întrebările similare în SO și nu am găsit nicio soluție. De asemenea, am explorat documentația Nginx și, de asemenea, nu am găsit răspunsul.

Am linia proxy_redirect ~^/(.*) $scheme://$http_host/path1/$1; și presupun că trebuie să facă treaba pe care mi-o doresc.

BTW nu pot ocupa / locația (creați configurația pentru calea rădăcină) în configurația mea Nginx, deoarece este rezervată unui alt server backend. Mulțumesc anticipat.

Richard Smith avatar
drapel jp
Primul parametru al instrucțiunii `proxy_redirect` trebuie să se potrivească cu șirul de text returnat în antetul `Locație` al răspunsului 302.Ar trebui să utilizați `curl -I` pentru a identifica textul exact al antetului.
Michael Hampton avatar
drapel cz
Trebuie să configurați aplicația backend pentru a genera astfel de adrese URL. Nu știe că îi deserviți rutele la /path1 (sau /path2 sau orice altceva) decât dacă i-ați spus în mod explicit.
Herman Sid avatar
drapel gq
@MichaelHampton Din păcate, aceste backend-uri nu sunt configurabile pentru utilizarea proxy. Sunt aplicații 3d și nu au setări pentru asta.
Herman Sid avatar
drapel gq
@RichardSmith Da, cred la fel. Expresia mea regex „proxy_redirect” nu este lovită de locația de redirecționare returnată. Am verificat și am găsit că răspunsurile backend cu „/login” în antetul Locație. Nginx îl îmbină cu numele de domeniu și primesc „https://example.com/login”. Astfel, Nginx nu se potrivește cu „~^/(.*)” și nu adaugă prefix.
Puncte:0
drapel jp

Poate din cauza antetelor X-Forwarded-Headers scrise greșit din configurația dvs. Ar trebui să fie X-Redirecţionat-* în loc de X-Înainte-*.

Postează un răspuns

Majoritatea oamenilor nu înțeleg că a pune multe întrebări deblochează învățarea și îmbunătățește legătura interpersonală. În studiile lui Alison, de exemplu, deși oamenii își puteau aminti cu exactitate câte întrebări au fost puse în conversațiile lor, ei nu au intuit legătura dintre întrebări și apreciere. În patru studii, în care participanții au fost implicați în conversații ei înșiși sau au citit transcrieri ale conversațiilor altora, oamenii au avut tendința să nu realizeze că întrebarea ar influența – sau ar fi influențat – nivelul de prietenie dintre conversatori.