当通过代理服务器(A)时,需要重新编写从应用服务器(B)发送的任何自引用链接以将代理用作主机 .
这是一个例子:
(B)的回复包含: <a href="http://apps/path">path</a>
代理(A)需要重写为: <a href="http://proxy/path">path</a>
通常,这是通过创建一个出站规则来完成的,该规则检查包含url的标记的html响应,查找对apps服务器的引用,并重写它们 .
Here's a normal rule GUI版本:
<outboundRules>
<rule name="Outbound Links" preCondition="IsHTML" enabled="true">
<match filterByTags="A, Form, IFrame, Img, Input, Link, Script" pattern="(https?:\/\/proxy|^)\/(.*)" />
<conditions logicalGrouping="MatchAll" trackAllCaptures="true" />
<action type="Rewrite" value="http://apps/{R:2}" />
</rule>
Where IsHTML is defined as :
<preConditions>
<preCondition name="IsHTML">
<add input="{RESPONSE_CONTENT_TYPE}" pattern="text\/html" />
</preCondition>
The problem 是通过XHR请求返回的一些页面内容 . 最低限度,这不符合HTML前提条件 .
但我可以扩展规则,也包括 xhr
的内容类型
但是,URL重写仍然有问题 parsing 将返回的文本转换为标记,因为它不是有效的HTML .
以下是响应的示例:
|6383|updatePanel|ctl00_mainContentPlaceHolder_contentUpdatePanel|
<div id="ctl00_mainContentPlaceHolder_resultsPanel">
<a href="http://apps/path">path</a>
</div>
...
|0|hiddenField|__EVENTTARGET||0|hiddenField|__EVENTARGUMENT||0|hiddenField|
但是,当我这样做时,我收到错误:
Sys.WebForms.PageRequestManagerParserErrorException:无法解析从服务器收到的消息 .
1 回答
您无法修改从ASP.NET返回的XHR请求 . 这样做是为了尝试中间人攻击(你的代理正在扮演),但微软有充分的理由阻止 .
这是一个虚拟消息,用于探索ASP.NET在响应中使用的语法:
Headers 以
1|#| |
开头,然后是消息其余部分的更新次数(2)然后每个更新部分遵循以下模式:
每个部分中的
len
必须与要遵循的字符数完全相等 . 因此,查找和替换这些消息中的内容是非常易变的 .最好的建议是简单地返回与服务器无关的相对URL,以便客户端可以相对于其当前域重定向 .