我们能够让反向代理的基本功能正常工作。它会重定向到内部网络服务器,然后您就可以返回网页。因此入站规则有效。
但是出站重写规则却没有……
这是生成的 HTML 的第一部分:
<!DOCTYPE html>
<html lang="en" class="main">
<head>
<meta charset="utf-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge" />
<base href="http://10.1.1.111/?_version=11.0.0.614" />
<title>Crappy Webapp</title>
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<meta name="description" content="">
<meta name="author" content="">
而且所有链接都是基于“基本 href”的“链接 href”,因此每次资源查找都会中断。由于某些难以理解的原因,我们无法让重写规则将该死的内部 IP 重写为公共域名。
我们已经关闭了缓存。(适用于有同样问题的另一项服务。)我们尝试了十亿种规则变体和先决条件,但我们预期的正确方法却不起作用。- 我们以 Base(和所有其他标签)为目标,匹配模式为 ^http(s)?://10.1.1.111/(.*) - 正则表达式 - 测试模式匹配。重写为“http{R:1}://service.domain.com/{R:2}
前提条件设置为 pattern="^text/html" 和 pattern="^text/css"。
如果这很重要的话,看起来该应用程序使用大量的 javascript 生成 HTML。
我意识到很难/不可能说出这里的问题是什么,但也许有人偶然发现了类似的问题并解决了它。
答案1
我的更聪明、更顽强的同事找到了解决方案!
简而言之,问题似乎在于匹配(和重写)的模式不是以“http://”开头,而只是没有 http:// 前缀的域和内部 IP——我希望其他人可以从中吸取教训。:)
所以这是完整的工作 webconfig 代码 - URL 和 IP 发生变化以保护无辜者。:)
<?xml version="1.0" encoding="UTF-8"?>
<configuration>
<system.webServer>
<rewrite>
<outboundRules>
<clear />
<rule name="Rewrite Realtive Paths">
<match filterByTags="A, Area, Base, Form, Frame, Head, IFrame, Img, Input, Link, Script" pattern="http://10.1.1.10" />
<action type="Rewrite" value="http://server.domain.com/" />
</rule>
<preConditions>
</preConditions>
</outboundRules>
<rules>
<rule name="ReverseProxyInboundRule1" stopProcessing="true">
<match url="(.*)" />
<action type="Rewrite" url="http://10.1.1.10/{R:1}" logRewrittenUrl="true" />
<serverVariables>
<set name="HTTP_ACCEPT_ENCODING" value="" />
</serverVariables>
</rule>
</rules>
</rewrite>
</system.webServer>
</configuration>