Puncte:1

nginx - cum se realizează funcțional o „redirecționare 307 internă”

drapel in

Nu sunt sigur cum să descriu funcționalitatea pe care încerc să o obțin într-un alt mod decât „o redirecționare 307 internă”.

Folosind Nginx's error_page directiva determină nginx să schimbe cererile POST în cereri GET. În configurația mea, Nginx trimite cererile către un server din amonte cu proxy_intercept_errors activat astfel încât să pot servi pagini de eroare de la nginx.

Exemplu:

pagina_eroare 500 502 503 =500 /50x.html;
locație = /50x.html {
    rădăcină /unele/document/rădăcină/;
}

Locație / {
    proxy_intercept_errors activat;
    proxy_pass https://undeva;
}

Cu această configurație în loc, solicitările POST care au ca rezultat un 500, 502 sau un 503 pe proxy vor deveni „în secret” solicitări GET către URI-ul original (/someurl). Iată o linie în jurnalul nginx care arată acest comportament (am schimbat formatul jurnalului pentru a afișa $request_method):

1.2.3.4 - - [27/Sep/2021:10:04:50 -0400] request_method=GET „POST /someurl HTTP/1.1 500 123 „https://domain.tld/someurl”...

Puteți vedea că nginx a schimbat cererea POST într-o solicitare GET. (Actualizare: se pare că documentele nginx pentru error_page spune exact asta...)

După câteva cercetări, se pare că acesta este un comportament intenționat și este rezultatul unei redirecționări interne. Se pare că codurile de răspuns 307 și 308 au fost create din cauza unui comportament similar (deși pe client, nu pe server).

Există ceva ce pot face care ar avea funcționalitatea unei „redirecționări interne 307”? adică, difuzați o pagină de eroare, dar păstrați metoda și corpul solicitării? Exemplu, pentru claritate:

Clientul POST la /someurl, serverul din amonte răspunde cu 500, nginx îl înghite și servește „/mygreat500errorpage.html” păstrând în același timp metoda de solicitare originală (POST), URI-ul cererii inițiale (/someurl) și corpul solicitării inițiale.

Actualizați, în timp ce încă scrieți asta: am găsit acest răspuns care sugerează utilizarea unui bloc de locație numit pentru a evita schimbarea metodei de solicitare. Acest lucru pare să funcționeze, cu excepția faptului că nu pot difuza „/mygreat500errorpage.html” din locația denumită. Nu sunt sigur dacă aceasta este chiar modalitatea corectă de a rezolva problema, așa că voi posta această întrebare oricum.

Michael Hampton avatar
drapel cz
Da, așa se face. Răspunsul pe care urma să-l scriu ar fi fost identic. Desigur, ar trebui să furnizați 307 și propriul dvs. URL.
Brosilio avatar
drapel in
@MichaelHampton această întrebare nu este o dublură, deoarece răspunsul la acea întrebare nu funcționează, sau cel puțin, nu știu cum să o implementez corect.
Michael Hampton avatar
drapel cz
Nu există nimic în întrebarea dvs. despre problemele pe care le-ați avut la implementarea acestuia. Vă rugăm să vă editați întrebarea pentru a furniza detaliile relevante.
Brosilio avatar
drapel in
s-a dovedit că ceea ce am vrut să fac a fost să permit efectiv solicitări POST către fișiere statice, ceea ce este (de înțeles) nu este permis - am ajuns să scriu un server web pentru a accepta solicitări POST către fișiere statice și doar proxy error_pages pentru cei care folosesc locații denumite, așa cum ați sugerat dvs. .

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.