nginx обрезает часть пути во время перенаправления proxy_pass

nginx обрезает часть пути во время перенаправления proxy_pass

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

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

Связанный контент