Я настраиваю обратный прокси-сервер, который получает запросы от сервера федеративной аутентификации и перенаправляет их в мое бэкэнд-приложение. Если в запросах отсутствует завершающий слеш, nginx выполняет перенаправление 301 по умолчанию, но адрес, на который он перенаправляется, не включает путь, сопоставленный в блоке местоположения. Идея заключается в том, чтобы проксировать запросы с upstream.com/myApp
на корневой URL backend.com/
в Gunicorn. Моя конфигурация такова:
geo $allow {
default 0;
<upstream ip> 1;
}
server {
listen 443 ssl;
listen [::]:443 ssl;
set_real_ip_from <backend ip>;
real_ip_header X-Forwarded-For;
if ($allow = 0) {
return 444;
}
server_name backend.com;
underscores_in_headers on;
include snippets/<ssl-conf>;
include snippets/<ssl-params>;
location /<myApp>/static/ {
root /<path>/<myApp>/static;
}
location /<myApp>/ {
include proxy_params;
proxy_pass_request_headers on;
proxy_pass http://unix:/<path>/<myApp>/<myApp>.sock:/;
}
location = /<myApp> {
include proxy_params;
proxy_pass_request_headers on;
proxy_pass
http://unix:/<path>/<myApp>/<myApp>.sock:/;
}
}
Первоначально я включил только первый блок location, но когда запрос от upstream.com/myApp
(без завершающего слеша) случался, nginx перенаправлял на backend.com/myApp/
, и не пересылал заголовки исходного запроса. Добавление второго блока location для предотвращения редиректа исправило это.
Однако теперь, если я получаю запрос типа upstream.com/myApp/search
(опять же, без завершающего слеша), он выполняет перенаправление 301 на upstream.com/search/
(добавляет завершающий слеш, но часть исчезает). Как мне сохранить часть в URL после того, как nginx выполнит перенаправление?
решение1
Я сделал еще немного отладки, и в итоге это не было проблемой Nginx. Скорее, это проблема Django, который не добавляет путь, отфильтрованный прокси-сервером nginx, к перенаправлениям.
решение2
Это не проблема Nginx, это функция Nginx. Если вы не хотите, чтобы Nginx удалял часть пути, которая соответствует вашему блоку location, то ваша директива proxy_pass не должна содержать путь, указанный после server:port или socket.
Это включает в себя только косую черту в конце, любой указанный вами путь заменит соответствующую часть вашего блока местоположения, а если вы укажете только косую черту, то это приведет к удалению соответствующей части.