2016-03-25 31 views
0

当通过代理服务器(A)时,应用服务器(B)发送的任何自引用链接需要重写以使用代理作为主机代替。在URL中重写来自非HTML响应的标记中的内容重写

这里有一个例子:

从(B)

响应包括:<a href="http://apps/path">path</a>
代理(A)需要为改写:通过创建检查HTML响应出站规则<a href="http://proxy/path">path</a>

通常情况下,这样做是对于包含url的标签,查找对应用程序服务器的引用,并重写它们。

这是一个正常的规则GUI version

<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> 

IsHTML被定义为

<preConditions> 
    <preCondition name="IsHTML"> 
     <add input="{RESPONSE_CONTENT_TYPE}" pattern="text\/html" /> 
    </preCondition> 

问题是,有些页面内容是通过返回XHR请求。最起码,这不符合HTML的先决条件。

Content Type - text/html vs XHR

,但我可以展开该规则还包括内容类型的xhr

但是,URL重写仍然有麻烦解析返回的文本标签,因为它是无效的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:
The message received from the server could not be parsed.

回答

0

您不能修改XHR请求从ASP回来。净。这样做可能会尝试一个中间人攻击(你的代理人扮演的角色),但微软有足够的理由来阻止。

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

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

头与1|#| |启动,然后更新该消息的剩余部分的数量(2)
然后每个更新部遵循模式:

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

在每个部分中的len必须正好等于遵循的字符数。因此,查找和替换这些消息中的内容非常浮躁。

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