ASP.NET Core Minimal API部署Linux VM后无法获取请求头问题
解决ASP.NET Core Minimal API部署后请求头参数丢失问题
可能原因及排查修复步骤
1. 反向代理的请求头过滤
DigitalOcean Droplet通常搭配Nginx/Apache这类反向代理托管ASP.NET Core应用,很多代理默认会过滤包含下划线的请求头(比如refresh_token)——因为下划线属于HTTP头非标准字符,部分代理会自动移除这类头。
修复操作:
- 若用Nginx:在站点配置的
location块中添加
执行underscores_in_headers on;sudo systemctl restart nginx重启服务生效。 - 若用Apache:修改
httpd.conf或虚拟主机配置,启用AllowEncodedSlashes NoDecode,并确认无过滤下划线的规则,重启Apache服务。
2. Swagger UI的请求头处理异常
Swagger UI在部分环境下,对带下划线的请求头可能存在处理问题——即便Chrome面板显示头已发送,实际可能被Swagger客户端逻辑修改或过滤。
验证方式:
用curl直接发送请求测试,排除Swagger的影响:
curl -H "refresh_token: 你的刷新令牌内容" https://你的域名/auth/refresh
若curl请求能正常获取参数,说明问题出在Swagger配置。
修复操作:
在Program.cs中显式配置Swagger的请求头参数定义:
builder.Services.AddSwaggerGen(c => { c.SwaggerDoc("v1", new OpenApiInfo { Title = "你的API名称", Version = "v1" }); c.AddSecurityDefinition("refresh_token", new OpenApiSecurityScheme { Name = "refresh_token", Type = SecuritySchemeType.ApiKey, In = ParameterLocation.Header, Description = "请求头中携带的刷新令牌" }); c.AddSecurityRequirement(new OpenApiSecurityRequirement { { new OpenApiSecurityScheme { Reference = new OpenApiReference { Type = ReferenceType.SecurityScheme, Id = "refresh_token" } }, Array.Empty<string>() } }); });
3. 请求头大小限制导致截断
ASP.NET Core默认对请求头总大小有限制,若refresh_token过长,可能被截断或拒绝。
修复操作:
在Program.cs中调整Kestrel的请求头大小限制:
builder.WebHost.ConfigureKestrel(options => { options.Limits.MaxRequestHeadersTotalSize = 1024 * 1024; // 设置为1MB,可根据实际令牌长度调整 });
4. 防火墙/CDN的拦截过滤
若Droplet前端配置了DigitalOcean Cloud Firewall或CDN服务,可能会拦截带有下划线的请求头。
排查操作:
临时关闭防火墙规则测试,或检查CDN的请求头过滤设置,确保refresh_token头允许通过。
内容的提问来源于stack exchange,提问作者Sam Marshall
相关产品推荐
相关产品推荐

