Редирект proxy запросов с поддериктории на корневую директорию

Рейтинг: 0Ответов: 1Опубликовано: 16.01.2023

Дано: веб-приложение, написанное на ASP.NET, развернуто на nginx. Прокси находится в поддиректории на сайте, скажем, https://example.com/api/. При попытке отправить GET или POST запрос его автоматически редиректит на https://example.com. Для примера, если запрос выглядит так: https://example.com/api?login=Vasya, то его редиректит на https://example.com?login=Vasya.

Цель: Убрать или починить это непотребство.

Настройки конфига сайта nginx:

    upstream api{
    server 127.0.0.1:5000;
}


server {
    listen        443 ssl;
    listen        [::]:443 ssl;
    server_name   example.com www.example.com;
    ssl_certificate /etc/ca-certificates/example.com.crt;
    ssl_certificate_key /etc/ca-certificates/example.com.key;
    root /var/www/html/;
    
    location / {
    }
    
    location /api/ {
        proxy_pass         http://api/;
        proxy_http_version 1.1;
        proxy_set_header   Upgrade $http_upgrade;
        proxy_set_header   Connection keep-alive;
        proxy_set_header   Host $host;
        proxy_cache_bypass $http_upgrade;
        proxy_set_header   X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header   X-Forwarded-Proto $scheme;
    }

}

server {
    listen        80;
    server_name   example.com www.example.com;
    return 301 https://$host$request_uri;
}

Помогите, а то я уже бьюсь в конвульсиях. Я в nginx новичок и, возможно, что-то настроил не так.

Ответы

▲ 0

Нашел решение. Проблема была не в nginx, а в самом ASP.NET.

Во первых, нужно указать базовый путь до сабдиректории, где будет лежать API. В Program.cs написать

app.UsePathBase(/api/)

обязательно со слешами в конце и в начале, иначе у меня не работало.

Далее мучал долгое время сваггер. Когда CURL запросы больше не редиректили на корневую директорию, он все равно продолжал туда отправлять запросы.

Выяснилось, что сваггеру плевать, какой в веб-приложении стоит PathBase.

Это решилось, добавив новый сервер с путем до необходимой мне сабдиректории:

app.UseSwagger(c =>
{
    c.RouteTemplate = "swagger/{documentName}/swagger.json";
    c.PreSerializeFilters.Add((swaggerDoc, httpReq) =>
    {
        swaggerDoc.Servers = new List<OpenApiServer> { new OpenApiServer 
            { Url = $"https://{httpReq.Host.Value}/api/", Description = "Authentication API"} };
    });
});