2016-03-25 33 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,以便客戶端可以相對於其當前域重定向。