IIS 8.5使用URL Rewrite实现子路径重写指向独立站点配置
IIS 8.5 跨独立站点路径重写配置方案
单独使用原生URL Rewrite模块无法实现跨独立站点的无跳转重写,之前配置返回404的本质是Rewrite动作仅支持当前站点上下文内的路径改写,当action中填写不带合法协议头的域名字符串时,模块会将其识别为Test 1站点下的本地相对路径,因此才会生成test1.mydomain.com/test2.mydomain.com/xxx的错误请求路径。
要实现需求,需要搭配应用请求路由(ARR)的反向代理能力,完整配置步骤如下:
前置准备
- 在IIS服务器上安装应用请求路由模块,安装完成后打开IIS根节点下的「应用请求路由缓存」配置项,勾选「启用代理」选项,保持默认参数即可
- 确认URL Rewrite模块版本不低于2.0,适配IIS 8.5的运行环境
- 在IIS站点的服务器变量白名单中,提前允许
HTTP_HOST变量的修改权限,避免后续配置触发500.19权限错误
Test 1站点web.config核心配置
将下列配置放到Test 1站点根目录的web.config文件的对应节点下,实现服务器端请求转发与路径匹配:
<system.webServer> <rewrite> <!-- 入站重写规则:匹配test1.mydomain.com/app下的所有请求,转发到Test 2站点 --> <rules> <rule name="ForwardAppRequestToTest2" stopProcessing="true"> <match url="^app(/.*)?$" /> <conditions> <!-- 自动匹配当前站点的http/https协议,避免跨协议请求错误 --> <add input="{CACHE_URL}" pattern="^(https?)://" /> </conditions> <action type="Rewrite" url="{C:1}://test2.mydomain.com{R:1}" appendQueryString="true" /> <!-- 转发时修改请求的Host头为Test 2站点域名,保证Test 2能正确识别站点归属 --> <serverVariables> <set name="HTTP_HOST" value="test2.mydomain.com" /> </serverVariables> </rule> </rules> <!-- 出站重写规则:修正Test 2返回内容里的相对路径,保证路径都带/app前缀 --> <outboundRules> <rule name="AdjustTest2ResponsePaths" preCondition="HtmlResponseCheck"> <match pattern="^/(.*)$" /> <action type="Rewrite" value="/app/{R:1}" /> </rule> <preConditions> <preCondition name="HtmlResponseCheck"> <add input="{RESPONSE_CONTENT_TYPE}" pattern="^text/html" /> </preCondition> </preConditions> </outboundRules> </rewrite> <security> <requestFiltering> <serverVariables> <add name="HTTP_HOST" allowed="true" /> </serverVariables> </requestFiltering> </security> </system.webServer>
配置注意事项
- 重写目标的URL必须携带完整的协议头(
http://或https://),如果只写域名,ARR会依然将其识别为本地相对路径,回到最初的404问题 - 出站重写规则可以自动修正Test 2返回页面内的相对路径链接、静态资源引用,不需要修改Test 2站点本身的代码,就能保证所有资源请求都带着
/app前缀,不会出现资源加载失败的问题 - 整个转发过程是服务器端完成的,全程不会触发浏览器跳转,地址栏会始终保留用户最初输入的
test1.mydomain.com/app路径 - Test 2站点原有的
test2.mydomain.com独立访问能力完全不受影响,无需改动原有配置 - 配置完成后重启Test 1站点的应用程序池即可生效,不需要重启整个IIS服务
内容的提问来源于stack exchange,提问作者Alfie Woodland
相关产品推荐
相关产品推荐

