Я не уверен, как описать функциональность, которую я пытаюсь реализовать, иначе, чем «внутренняя переадресация 307».
Использование nginx страница_ошибки
директива заставляет nginx изменять POST-запросы на GET-запросы.
В моей конфигурации Nginx проксирует запросы на какой-то вышестоящий сервер с proxy_intercept_errors на
чтобы я мог обслуживать страницы ошибок из nginx.
Пример:
error_page 500 502 503 =500/50x.html;
местоположение = /50x.html {
корень /некоторые/документ/корень/;
}
место расположения / {
proxy_intercept_errors включен;
proxy_pass https://где-то;
}
С этой конфигурацией запросы POST, которые приводят к 500, 502 или 503 на прокси-сервере, будут «тайно» становиться запросами GET к исходному URI (/someurl).
Вот строка в журнале nginx, показывающая это поведение (я изменил формат журнала, чтобы показать $request_method):
1.2.3.4 - - [27/сен/2021:10:04:50 -0400] request_method=GET "POST /someurl HTTP/1.1 500 123 "https://domain.tld/someurl"...
Вы можете видеть, что nginx изменил запрос POST на запрос GET.
(Обновление: по-видимому, документы nginx для страница_ошибки скажи именно так...)
После некоторых исследований кажется, что это преднамеренное поведение и результат внутреннего перенаправления. По-видимому, коды ответов 307 и 308 были созданы из-за схожего поведения (хотя и на клиенте, а не на сервере).
Могу ли я что-нибудь сделать, чтобы иметь функциональность «внутреннего перенаправления 307»? т. е. обслуживать страницу с ошибкой, но сохранять метод и тело запроса? Пример, для ясности:
Клиент отправляет POST в /someurl, вышестоящий сервер отвечает 500, nginx проглатывает его и обслуживает «/mygreat500errorpage.html», сохраняя при этом исходный метод запроса (POST), исходный URI запроса (/someurl) и исходное тело запроса.
Обновите, продолжая писать это:
я нашел это ответ, который предлагает использовать именованный блок местоположения, чтобы избежать изменения метода запроса. Кажется, это работает, за исключением того, что я не могу обслуживать "/mygreat500errorpage.html" из указанного местоположения. Я не уверен, что это даже правильный способ решения проблемы, поэтому я все равно задам этот вопрос.