如何在IIS中配置反向代理转发至本地ASP.NET Core站点?
解决IIS反向代理转发到ASP.NET Core站点的502.3/无效主机名问题
结合你遇到的网关错误、无效主机名问题,以及已做的配置尝试,咱们一步步排查修复:
1. 先让ASP.NET Core站点正确接受代理请求
你遇到的Invalid Hostname错误,核心原因是ASP.NET Core默认会验证请求的主机头——当IIS把example.com的请求转发过去时,站点不识别这个主机名,直接拒绝了。你需要做这两项配置:
- 在项目的
Program.cs里配置允许转发头,同时信任本地代理服务器:builder.Services.Configure<ForwardedHeadersOptions>(options => { options.ForwardedHeaders = ForwardedHeaders.XForwardedFor | ForwardedHeaders.XForwardedProto; // 把本地IIS的IP加入信任列表 options.KnownProxies.Add(IPAddress.Parse("127.0.0.1")); }); // 启动时启用转发头 app.UseForwardedHeaders(); - 如果你想偷懒(仅测试环境用),可以直接让Kestrel允许所有主机头:
builder.WebHost.UseKestrel(options => { // 如果你还在监听HTTPS的44359端口 options.ListenAnyIP(44359, o => o.UseHttps()); // 如果已经改成HTTP监听,替换成对应的端口,比如5000 // options.ListenAnyIP(5000); });
2. 修正IIS的URL重写规则
502.3错误大概率是转发的协议、地址配置不匹配。根据你的站点监听方式,选对应的规则配置:
情况1:ASP.NET Core站点仍用HTTPS(44359)
关闭SSL卸载,用下面的重写规则(确保IIS信任ASP.NET Core的localhost证书,不然会因为证书不被信任断开连接):
<rewrite> <rules> <rule name="ProxyToAspNetCoreHTTPS" stopProcessing="true"> <match url="(.*)" /> <action type="Rewrite" url="https://localhost:44359/{R:1}" /> <serverVariables> <set name="HTTP_X_FORWARDED_PROTO" value="https" /> <set name="HTTP_X_FORWARDED_HOST" value="{HTTP_HOST}" /> </serverVariables> </rule> </rules> <!-- 出站规则修正返回的Location头,避免跳转到localhost --> <outboundRules> <rule name="FixLocationHeader" preCondition="IsHtmlResponse"> <match serverVariable="RESPONSE_Location" pattern="^https://localhost:44359/(.*)" /> <action type="Rewrite" value="https://{HTTP_HOST}/{R:1}" /> </rule> <preConditions> <preCondition name="IsHtmlResponse"> <add input="{RESPONSE_CONTENT_TYPE}" pattern="^text/html" /> </preCondition> </preConditions> </outboundRules> </rewrite>
情况2:ASP.NET Core站点改成HTTP监听(比如5000)
开启SSL卸载(IIS处理HTTPS,转发到HTTP站点),规则改成:
<rewrite> <rules> <rule name="ProxyToAspNetCoreHTTP" stopProcessing="true"> <match url="(.*)" /> <action type="Rewrite" url="http://localhost:5000/{R:1}" /> <serverVariables> <set name="HTTP_X_FORWARDED_PROTO" value="https" /> <set name="HTTP_X_FORWARDED_HOST" value="{HTTP_HOST}" /> </serverVariables> </rule> </rules> <outboundRules> <rule name="FixLocationHeader" preCondition="IsHtmlResponse"> <match serverVariable="RESPONSE_Location" pattern="^http://localhost:5000/(.*)" /> <action type="Rewrite" value="https://{HTTP_HOST}/{R:1}" /> </rule> <preConditions> <preCondition name="IsHtmlResponse"> <add input="{RESPONSE_CONTENT_TYPE}" pattern="^text/html" /> </preCondition> </preConditions> </outboundRules> </rewrite>
3. 证书相关的小细节
如果选择HTTPS转发的方式,一定要把ASP.NET Core用的localhost自签证书导入到IIS服务器的受信任根证书颁发机构里——不然IIS会因为证书不被信任,主动断开和站点的连接,直接触发502.3错误。
4. 最后检查基础配置
- 确认IIS的
Application Request Routing模块里,已经勾选了Enable proxy(在服务器级别的ARR设置里); - 用
netstat -ano | findstr :443检查443端口有没有被其他程序占用; - 确保hosts文件的
127.0.0.1 example.com配置生效(可以ping example.com验证)。
按这个流程调整后,应该就能正常转发请求了。如果还有问题,可以再看失败请求日志里的ARR_EXCEPTION字段,能更精准定位连接失败的原因。
内容的提问来源于stack exchange,提问作者TheHvidsten
相关产品推荐
相关产品推荐

