You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.13 08:31:41