所有站点的“/api/”文件夹的 IIS 反向代理/全局 URL 重写

Posted

技术标签:

【中文标题】所有站点的“/api/”文件夹的 IIS 反向代理/全局 URL 重写【英文标题】:IIS Reverse proxy/Global URL Rewrite for "/api/" folder for all sites 【发布时间】:2020-08-23 08:47:17 【问题描述】:

对于请求位于“/api/”文件夹中的任何站点,我想将任何请求反向代理到 IIS 实例。我设置了一个服务器场,并使用“*”通配符让反向代理为所有内容工作,但是当我想将范围限制为 RegEx 时,它不会重写/代理到后端服务器。我在 IIS 实例级别采取的步骤:

    设置网络场 - 其中只有一台服务器 machine2 为“*”设置重写 针对“http://machine1/site1/api/api1”进行测试 - 已成功路由到 machine2/site1/api/api1 将入站规则从通配符更改为正则表达式 将模式更改为 '.(/./api/.*)'(不带单引号) 针对“http://sarjhennew10vm/site1/api/api1”进行测试 请求未路由到机器 2。

下面是我的 applicationHost.config [IIS 的根目录] 中的一个 sn-p。

    <rewrite>
        <globalRules>
            <rule name="ARR_Farm1_loadbalance" patternSyntax="ECMAScript" stopProcessing="true">
                <match url=".*(\/.*\/api\/.*)" />
                <action type="Rewrite" url="http://Farm1/R:1" />
            </rule>
        </globalRules>
    </rewrite>
    <proxy enabled="true" />

是否可以为特定文件夹的实例上的任何站点将全局 URL 重写到服务器场?

编辑:下面已回答 - 我附上一张图片以防其他人遇到此问题。测试模式对我来说并不清楚 - 并且计数器文档 found here。

【问题讨论】:

【参考方案1】:

你的模式不对,你可以试试下面的代码,把rewrite url改成https://Farm1/R: 0

<rule name="ARR_Farm1_loadbalance" patternSyntax="ECMAScript" stopProcessing="true">
    <match url=".*(\/api\/.*)" />
    <action type="Rewrite" url="https://Farm1/R:0" />
</rule>

【讨论】:

成功了。我正在查看“测试模式”结果,该结果由捕获组 0 和 1 爆发。我认为通过放置组 r:1(只是“site1/api/api1”)它会解析为farm1/site1/api/api1,但是不是这样。确实 r:0,在测试模式中解析为 'machine1/site1/api/api1') 解析为我想要的。我不清楚,但它有效 - 非常感谢!

以上是关于所有站点的“/api/”文件夹的 IIS 反向代理/全局 URL 重写的主要内容,如果未能解决你的问题,请参考以下文章

使用Nginx反向代理 让IIS和Tomcat等多个站点一起飞

在IIS7中使用ARR(Application Request Routing)反向代理虚拟目录到Nodejs站点

在IIS7中使用ARR(Application Request Routing)反向代理虚拟目录到Nodejs站点

Nginx实现HTTP和WebSocket的反向代理

IIS Express 可以支持反向代理吗?

nginx 正向代理与反向代理