IIS 10跨域调用多服务的URL Rewrite配置方法
在Windows Server 2022的IIS 10中配置URL转发实现服务映射
要实现将xyz.com/serviceN转发到abc.com:端口/serviceN的需求,需要用到IIS的URL Rewrite模块和反向代理功能,具体步骤如下:
1. 安装必备组件
首先确保你的IIS已经安装了URL Rewrite和**Application Request Routing (ARR)**扩展:
- 打开IIS管理器,点击顶部的服务器节点,在右侧「管理」区选择「Web平台安装程序」。
- 搜索并安装「URL Rewrite」和「Application Request Routing」两个组件,安装完成后重启IIS管理器。
2. 启用反向代理功能
ARR是实现反向代理的核心,需要先开启:
- 在IIS管理器中选中服务器节点,在功能视图里找到「Application Request Routing Cache」并双击打开。
- 点击右侧操作面板的「Server Proxy Settings」,勾选「Enable proxy」选项,然后点击「应用」。
3. 配置URL Rewrite规则
接下来针对每个服务创建转发规则,你可以选择图形界面操作或者直接编辑web.config:
方式一:图形界面配置
- 选中
xyz.com对应的网站节点,打开「URL Rewrite」功能。 - 点击右侧「Add Rule(s)...」,选择「Blank Rule」后点击「OK」。
- 配置service1的规则:
- 名称填「Forward service1 to abc.com:1234」
- 匹配URL区域:
- 「Requested URL」选「Matches the Pattern」
- 「Using」选「Regular Expressions」
- 「Pattern」输入
^service1(/.*)?$(匹配service1开头的所有路径,包括xyz.com/service1和xyz.com/service1/xxx) - 勾选「Ignore case」
- 操作区域:
- 「Action type」选「Rewrite」
- 「Rewrite URL」输入
http://abc.com:1234/service1{R:1}({R:1}会保留原请求的后续路径) - 勾选「Append query string」(保留原请求的查询参数)
- 可选勾选「Stop processing of subsequent rules」(避免后续规则干扰当前请求)
- 点击「应用」,重复上述步骤创建service2的规则:
- 匹配Pattern改为
^service2(/.*)?$ - 重写URL改为
http://abc.com:5678/service2{R:1}
- 匹配Pattern改为
- 其他服务按同样格式添加规则即可。
方式二:手动编辑web.config
如果更习惯直接修改配置文件,找到xyz.com网站根目录下的web.config(没有的话新建),添加以下内容:
<configuration> <system.webServer> <rewrite> <rules> <!-- 转发service1到abc.com:1234 --> <rule name="Forward service1" stopProcessing="true"> <match url="^service1(/.*)?$" /> <action type="Rewrite" url="http://abc.com:1234/service1{R:1}" appendQueryString="true" /> </rule> <!-- 转发service2到abc.com:5678 --> <rule name="Forward service2" stopProcessing="true"> <match url="^service2(/.*)?$" /> <action type="Rewrite" url="http://abc.com:5678/service2{R:1}" appendQueryString="true" /> </rule> <!-- 新增其他服务规则请复制上述模板修改 --> </rules> </rewrite> </system.webServer> </configuration>
4. 验证配置
- 访问
xyz.com/service1和xyz.com/service2,检查是否正确转发到对应地址。可以通过浏览器的开发者工具查看请求的实际跳转目标,或者使用curl命令测试。 - 注意确保
abc.com服务器的防火墙允许xyz.com服务器访问1234、5678等目标端口,否则请求会被拦截。
内容的提问来源于stack exchange,提问作者Manish Gupta
相关产品推荐
相关产品推荐

