ASP.NET Core MVC中RequireHttpsAttribute引发ERR_TOO_MANY_REDIRECTS问题求助
解决ASP.NET Core 2.0 MVC在IIS上的HTTPS循环重定向问题
这种ERR_TOO_MANY_REDIRECTS的循环重定向问题我在部署ASP.NET Core站点时碰到好多次了,大概率是IIS和ASP.NET Core的重定向逻辑冲突,或者反向代理头没配置对,咱们一步步来排查解决:
1. 先检查反向代理头配置(最常见诱因)
因为你用IIS作为反向代理而非直接暴露Kestrel,Kestrel收到的其实是IIS转发的HTTP请求。如果没正确配置转发头,Kestrel会误以为当前请求是HTTP,触发重定向到HTTPS;而IIS又把HTTPS请求转成HTTP发给Kestrel,直接形成循环。
在Startup.cs里补充转发头配置:
- 在
ConfigureServices方法中添加:
services.Configure<ForwardedHeadersOptions>(options => { options.ForwardedHeaders = ForwardedHeaders.XForwardedFor | ForwardedHeaders.XForwardedProto; // 服务器在本地的话,添加回环IP到信任列表 options.KnownProxies.Add(IPAddress.Parse("127.0.0.1")); });
- 在
Configure方法中,必须把UseForwardedHeaders放在UseHttpsRedirection之前:
app.UseForwardedHeaders(); app.UseHttpsRedirection(); // 其他中间件比如UseMvc放在后面 app.UseMvc(routes => { routes.MapRoute( name: "default", template: "{controller=Home}/{action=Index}/{id?}"); });
2. 排查是否存在双重重定向配置
你已经在Startup.cs里配置了自动重定向,要确保IIS里没有重复设置:
- 打开IIS管理器,找到你的站点,检查HTTP重定向功能是否启用,若是直接禁用;
- 检查URL重写模块里是否手动添加了HTTP到HTTPS的重写规则,如有则禁用或删除,避免和代码逻辑冲突。
3. 验证HTTPS端口与绑定一致性
确保代码里的HTTPS端口和IIS的SSL绑定完全匹配:
在ConfigureServices的AddHttpsRedirection里明确指定端口为443:
services.AddHttpsRedirection(options => { options.RedirectStatusCode = StatusCodes.Status301MovedPermanently; options.HttpsPort = 443; });
同时检查IIS站点绑定:确认443端口绑定了正确的Let's Encrypt证书,80端口仅绑定HTTP(无SSL证书),主机名和站点域名一致。
4. 检查HSTS配置是否过度严格
如果你在代码里启用了HSTS(app.UseHsts();),注意:
- 不要随意设置
includeSubDomains参数,除非所有子域名都配置了有效SSL证书; - 开发环境下禁用HSTS,避免本地测试时缓存导致的异常(可以用
if (!env.IsDevelopment()) { app.UseHsts(); }做环境判断)。
5. 用浏览器工具追踪重定向链
打开Chrome开发者工具(F12),切换到Network标签,勾选“Preserve log”后刷新页面:
- 如果看到请求在
http://xxx和https://xxx之间来回跳转,基本就是反向代理头没配置对; - 如果跳转URL包含错误端口或主机名,立刻检查绑定和端口配置。
内容的提问来源于stack exchange,提问作者Sha
相关产品推荐
相关产品推荐

