Рейтинг:1

nginx — как функционально реализовать «внутреннюю переадресацию 307»

флаг in

Я не уверен, как описать функциональность, которую я пытаюсь реализовать, иначе, чем «внутренняя переадресация 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" из указанного местоположения. Я не уверен, что это даже правильный способ решения проблемы, поэтому я все равно задам этот вопрос.

Michael Hampton avatar
флаг cz
Да, это способ сделать это. Ответ, который я собирался написать, был бы идентичен. Конечно, вы должны указать 307 и свой собственный URL.
Brosilio avatar
флаг in
@MichaelHampton этот вопрос не является дубликатом, потому что ответ на этот вопрос не работает, или, по крайней мере, я не знаю, как его правильно реализовать.
Michael Hampton avatar
флаг cz
В вашем вопросе нет ничего о проблемах, с которыми вы столкнулись при его реализации. Пожалуйста, отредактируйте свой вопрос, чтобы предоставить соответствующие детали.
Brosilio avatar
флаг in
Оказывается, я хотел эффективно разрешить POST-запросы к статическим файлам, что (по понятным причинам) не разрешено - в итоге я написал веб-сервер для приема POST-запросов к статическим файлам и просто проксировал error_pages для тех, кто использует именованные местоположения, как вы бы предложили .

Ответить или комментировать

Большинство людей не понимают, что склонность к познанию нового открывает путь к обучению и улучшает межличностные связи. В исследованиях Элисон, например, хотя люди могли точно вспомнить, сколько вопросов было задано в их разговорах, они не чувствовали интуитивно связи между вопросами и симпатиями. В четырех исследованиях, в которых участники сами участвовали в разговорах или читали стенограммы чужих разговоров, люди, как правило, не осознавали, что задаваемый вопрос повлияет — или повлиял — на уровень дружбы между собеседниками.