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.