Редирект proxy запросов с поддериктории на корневую директорию
Дано: веб-приложение, написанное на 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 новичок и, возможно, что-то настроил не так.
Ответы (1 шт):
Нашел решение. Проблема была не в 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"} };
});
});