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

IIS反向代理返回404错误且响应URL异常,CORS重写规则故障求助

解决IIS反向代理的CORS问题:路径匹配与错误响应传递

这两个问题都是反向代理场景下的典型配置疏漏,咱们直接针对问题调整规则和设置:

问题1:响应返回路径不符合预期(缺失xyz前缀)

当你把https://site1/xyz/extFlow/Test.svc/testAPI重写到site2后,site2返回的响应里(比如Location头、或响应内容中的URL)会是它自己的路径/extFlow/...,IIS默认不会自动帮你把这个路径替换回带xyz前缀的版本,导致前端拿到的响应路径错误。

解决方法是添加出站重写规则,把响应中来自site2的路径替换为site1的完整前缀路径:

完整的入站+出站规则配置(web.config片段)

<rewrite>
  <rules>
    <!-- 入站重写规则:匹配带xyz前缀的extFlow请求 -->
    <rule name="ReverseProxyToSite2" stopProcessing="true">
      <match url="^xyz/extFlow/(.*)" />
      <action type="Rewrite" url="https://site2/extFlow/{R:1}" />
      <!-- 保留原始编码头,避免压缩相关问题 -->
      <serverVariables>
        <set name="HTTP_X_ORIGINAL_ACCEPT_ENCODING" value="{HTTP_ACCEPT_ENCODING}" />
        <set name="HTTP_ACCEPT_ENCODING" value="" />
      </serverVariables>
    </rule>
  </rules>
  <outboundRules>
    <!-- 出站规则:替换HTML内容中的site2路径为site1的xyz前缀路径 -->
    <rule name="RewriteSite2ResponsePaths" preCondition="IsHTML">
      <match filterByTags="A, Area, Base, Form, Frame, Head, IFrame, Img, Input, Link, Script" pattern="^https?://site2/extFlow/(.*)" />
      <action type="Rewrite" value="https://site1/xyz/extFlow/{R:1}" />
    </rule>
    <!-- 处理响应头中的Location字段,确保跳转路径正确 -->
    <rule name="RewriteSite2LocationHeader">
      <match serverVariable="RESPONSE_Location" pattern="^https?://site2/extFlow/(.*)" />
      <action type="Rewrite" value="https://site1/xyz/extFlow/{R:1}" />
    </rule>
    <!-- 预条件:只处理HTML类型的响应,避免干扰其他资源 -->
    <preConditions>
      <preCondition name="IsHTML">
        <add input="{RESPONSE_CONTENT_TYPE}" pattern="^text/html" />
      </preCondition>
    </preConditions>
  </outboundRules>
</rewrite>

关键说明:

  • 入站规则的match url明确匹配^xyz/extFlow/(.*),确保只有带xyz前缀的请求才会被代理到site2
  • 出站规则分别处理HTML内容中的URL标签,以及响应头里的Location字段,把site2的路径替换回site1的xyz/extFlow前缀路径

问题2:site2返回500错误时,反向代理返回404

这个问题是因为IIS的Application Request Routing(ARR)模块默认会把后端的错误响应视为“资源不存在”,并返回404。需要调整ARR的错误响应传递设置,让它直接转发后端的错误状态码。

解决步骤:

  1. 打开IIS管理器,找到你的site1站点,点击右侧的Application Request Routing Cache
  2. 在ARR的设置界面,点击左侧的Server Proxy Settings
  3. 勾选Reverse rewrite host in response headers,确保ARR能正确重写响应头中的主机名
  4. 在web.config中添加以下配置,强制IIS传递后端的错误状态:
<system.webServer>
  <httpErrors existingResponse="PassThrough" />
  <proxy enabled="true" preserveHostHeader="false" reverseRewriteHostInResponseHeaders="true">
    <responseHeaders>
      <remove name="X-Powered-By" />
    </responseHeaders>
  </proxy>
</system.webServer>

关键说明:

  • httpErrors existingResponse="PassThrough"告诉IIS不要替换后端返回的错误响应,直接传递给客户端
  • proxy reverseRewriteHostInResponseHeaders="true"确保ARR配合出站规则正确处理响应头中的主机信息

最后要确认你已经安装并启用了URL Rewrite和**Application Request Routing(ARR)**模块,这两个是IIS做反向代理的必备组件。

内容的提问来源于stack exchange,提问作者SoothingMusic

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.19 09:47:14