Puncte:1

Cum să proxy adresa URL completă la configurația nginx?

drapel ve

Trebuie să proxy locații /v1/api/ la o altă adresă URL ca:

locație /api/v1/ {
        proxy_pass http://frontend-api.preprod.my-app.com/api/v1/;
    }

cu toate acestea, la mainstream, doar slug-ul este primit:

„GET /api/v1/ HTTP/1.1” 404 209 „-” „Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, ca Gecko) Chrome/96.0.4664.110 Safari/537.36”

deoarece upstream-ul este configurat pentru domeniul specific frontend-api.preprod.my-app.com:

Server {
    asculta 80;
    nume_server frontend-api.preprod.my-app.com;

   Locație / {
      root /var/www/frontend_api/current/public;

      # Activați Pasager
      pasager_activat pe;
      passenger_ruby /home/deploy/.rvm/gems/ruby-2.7.2/wrappers/ruby;
    }

}

rezultatul final este 404. Cum ar configura proxy_pass la serverul proxy pentru a trimite și gazda, astfel încât serverul de primire să primească adresa URL completă în loc de doar /api/v1/ ?

Puncte:2
drapel us

documentația nginx explică comportamentul:

Dacă directiva proxy_pass este specificată cu un URI, atunci când o solicitare este transmisă serverului, partea unui URI de solicitare normalizat care se potrivește cu locația este înlocuită cu un URI specificat în directivă:

În cazul dvs., înseamnă că URI-ul cererii este înlocuit cu /api/v1/ URI specificat în dvs proxy_pass directivă.

Dacă doriți ca URI să fie transmis așa cum este, atunci trebuie să faceți:

locație /api/v1/ {
    proxy_pass http://frontend-api.preprod.example.com;
}

În acest caz, nginx utilizează URI-ul din cererea originală cu proxy_pass destinație, așa cum este descrisă de:

Dacă proxy_pass este specificat fără un URI, URI-ul cererii este transmis serverului în aceeași formă cu cea trimisă de un client atunci când cererea inițială este procesată, sau URI-ul complet normalizat al cererii este transmis la procesarea URI-ului modificat:

Dacă doriți să înlocuiți o parte a URI-ului cererii cu o altă parte, trebuie să utilizați capturarea expresiilor regulate:

locație ~ ^/sursă/cale/(.*) {
    proxy_pass http://example.com/destination/path/$1;
}

Editați | ×:

Pentru ca numele de domeniu al cererii inițiale să fie transmis în amonte, trebuie să setați Gazdă Antet HTTP pentru cererea în amonte:

proxy_set_header Gazdă $gazdă;

Este adesea util să transmiteți și adresa IP a vizitatorului prin antet:

proxy_set_header X-Forwarded-For $remote_addr;
simo avatar
drapel ve
Am încercat `proxy_pass http://frontend-api.preprod.example.com;`, dar pe de altă parte, obțin în continuare același rezultat. Nu am o problemă cu trecerea slug-ului, problema este că URL-ul de bază nu este transmis, doar`/api/v1/` este văzut la serverul de primire, nu `http://frontend-api.preprod. exemplu.com/api/v1/`
drapel us
Nu puteți transmite adresa URL completă ca URI solicitării către backend. Pentru a obține numele gazdei, trebuie să utilizați antetele HTTP. Am adăugat un exemplu la răspuns.
simo avatar
drapel ve
Mulțumesc, am încercat să setez antetul Host la $host, cu toate acestea, după aceea, nu pot vedea jurnalele care vin în access.log-ul receptorului nginx!
drapel us
Atunci setarea numelui de gazdă virtuală în receptor nginx nu este corectă.
simo avatar
drapel ve
Multumesc, a fost o problema..

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.