如何修正Nginx反向代理ASP.NET Core应用的HTTPS重定向端口问题
解决方案
问题出在你的ASP.NET Core应用无法感知外部请求是通过HTTPS(Nginx的443端口)进入的,所以app.UseHttpsRedirection()会默认重定向到自身的HTTPS端口5001。需要从Nginx传递正确的转发头,并让ASP.NET Core信任这些头来修正重定向目标。
1. 修正Nginx配置
首先清理重复的location /块,启用转发协议头,并补充SSL证书配置(listen 443 ssl必须指定证书文件):
# 处理HTTP请求,强制跳转到HTTPS server { listen 80; listen [::]:80; server_name myServername; return 301 https://$host$request_uri; } server { listen [::]:443 ssl default_server; listen 443 ssl default_server; server_name myServername; # 替换为你的SSL证书实际路径 ssl_certificate /path/to/your/certificate.crt; ssl_certificate_key /path/to/your/private.key; location / { proxy_pass http://localhost:5000; 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-Real-IP $remote_addr; # 关键:告诉ASP.NET请求的真实协议是HTTPS proxy_set_header X-Forwarded-Proto $scheme; } }
2. 配置ASP.NET Core信任转发头
在Program.cs中添加ForwardedHeaders中间件,必须放在UseHttpsRedirection和UseHsts之前,让应用信任来自本地Nginx的转发信息:
var builder = WebApplication.CreateBuilder(args); // 添加你的服务配置... var app = builder.Build(); // 配置转发头,信任本地代理 app.UseForwardedHeaders(new ForwardedHeadersOptions { ForwardedHeaders = ForwardedHeaders.XForwardedFor | ForwardedHeaders.XForwardedProto, // 允许来自localhost的转发(Nginx运行在本地服务器) KnownProxies = { IPAddress.Parse("127.0.0.1"), IPAddress.Parse("::1") } }); // 保持原有中间件顺序不变 app.UseHttpsRedirection(); app.UseHsts(); app.UseStaticFiles(); app.UseRouting(); // ...其他中间件配置 app.Run();
3. 重启服务
保存配置后,重启Nginx和ASP.NET Core应用:
sudo systemctl restart nginx sudo systemctl restart your-aspnet-app-service # 替换为你的应用服务名称
原理说明
X-Forwarded-Proto头会告诉ASP.NET Core外部请求使用的是HTTPS协议,因此UseHttpsRedirection会生成指向https://myServername:443的重定向,而非应用自身的5001端口。ForwardedHeaders中间件让应用信任来自Nginx的转发信息,避免因忽略这些头导致的协议判断错误。
内容的提问来源于stack exchange,提问作者user7555530
相关产品推荐
相关产品推荐

