首页 文章

匹配URL Rewrite中非HTML响应的标记内容

提问于
浏览
0

当通过代理服务器(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前提条件 .

Content Type - text/html vs XHR

但我可以扩展规则,也包括 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 回答

  • 0

    您无法修改从ASP.NET返回的XHR请求 . 这样做是为了尝试中间人攻击(你的代理正在扮演),但微软有充分的理由阻止 .

    这是一个虚拟消息,用于探索ASP.NET在响应中使用的语法:

    1|#||2|52|updatePanel|ctl00_mainContentPlaceHolder_firstUpdatePanel|
        <p> New Content For First Update Panel </p>
    

    Headers 以 1|#| | 开头,然后是消息其余部分的更新次数(2)
    然后每个更新部分遵循以下模式:

    |char_len|update_type|id_of_field_to_update|   
    New contents to insert into field
    

    每个部分中的 len 必须与要遵循的字符数完全相等 . 因此,查找和替换这些消息中的内容是非常易变的 .

    最好的建议是简单地返回与服务器无关的相对URL,以便客户端可以相对于其当前域重定向 .

相关问题