IIS结合ARR实现动态转发反向代理的问题求助
IIS+ARR反向代理动态转发问题解决
问题背景
需要用IIS搭配ARR实现反向代理,将http://Proxyserver/Targetcomputer/API_String格式的请求转发到http://Targetcomputer/API_String。配置URL重写规则后无法实现动态跳转,Web服务器仅能访问本地资源,测试请求返回404,日志显示规则匹配失败。
当前web.config中的重写规则:
<rule name="Test" enabled="true" stopProcessing="true"> <match url="^([^/]+)/([^/]+)" /> <action type="Rewrite" url="http://{R:1}/{R:2}" LogRewrittenUrl="true" /> </rule>
失败日志关键信息:测试请求http://localhost:80/www.ibm.com的URL部分为www.ibm.com,匹配模式^(.*)/(.*)返回Matched: false。
解决方法
1. 修正URL匹配规则
现有规则要求URL必须包含至少一个斜杠来分割目标主机和API路径,但测试请求www.ibm.com无斜杠导致匹配失败。若需同时支持带API路径和不带的情况,调整匹配模式:
<rule name="Test" enabled="true" stopProcessing="true"> <match url="^([^/]+)(?:/(.*))?$" /> <action type="Rewrite" url="http://{R:1}/{R:2}" LogRewrittenUrl="true" /> </rule>
该模式可匹配两种场景:
Targetcomputer/API_String→{R:1}=Targetcomputer,{R:2}=API_Stringwww.ibm.com→{R:1}=www.ibm.com,{R:2}为空,转发到http://www.ibm.com/
2. 确认ARR代理功能启用
- 打开IIS管理器,检查Application Request Routing Cache已安装并启用。
- 进入ARR的「服务器代理设置」,勾选「启用代理」,保持默认转发设置即可。
- 在服务器上用
ping Targetcomputer或curl http://Targetcomputer测试,确保能正常访问目标地址。
3. 添加服务器变量配置
为正确传递请求头、避免目标服务器拒绝请求,需添加服务器变量设置:
<rule name="Test" enabled="true" stopProcessing="true"> <match url="^([^/]+)(?:/(.*))?$" /> <action type="Rewrite" url="http://{R:1}/{R:2}" LogRewrittenUrl="true" /> <serverVariables> <set name="HTTP_X_FORWARDED_HOST" value="{HTTP_HOST}" /> <set name="HTTP_X_FORWARDED_FOR" value="{REMOTE_ADDR}" /> </serverVariables> </rule>
随后在IIS的URL重写模块中,进入「查看服务器变量」,添加HTTP_X_FORWARDED_HOST和HTTP_X_FORWARDED_FOR并允许修改。
4. 检查权限与防火墙
- 确认应用程序池身份(如
DefaultAppPool)具备发起外部HTTP请求的权限。 - 检查服务器防火墙,允许向外的HTTP/HTTPS请求到目标客户端地址。
验证测试
用标准格式请求http://Proxyserver/Targetcomputer/API_String测试,查看失败请求日志是否显示规则匹配成功,同时检查ARR代理日志确认转发请求已发送到目标主机。
内容的提问来源于stack exchange,提问作者Andreas Schmitz
相关产品推荐
相关产品推荐

