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的错误响应传递设置,让它直接转发后端的错误状态码。
解决步骤:
- 打开IIS管理器,找到你的site1站点,点击右侧的Application Request Routing Cache
- 在ARR的设置界面,点击左侧的Server Proxy Settings
- 勾选Reverse rewrite host in response headers,确保ARR能正确重写响应头中的主机名
- 在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
相关产品推荐
相关产品推荐

