專利名稱:一種反向Web代理的鏈接改寫方法
技術(shù)領(lǐng)域:
本發(fā)明涉及計(jì)算機(jī)領(lǐng)域,尤其涉及一種反向Web代理HTML頁面中鏈接的改寫方法。
背景技術(shù):
反向代理服務(wù)(也稱為逆向代理)是指一個(gè)Web代理服務(wù)器或Web代理網(wǎng)關(guān)(簡(jiǎn) 稱代理服務(wù)器或代理網(wǎng)關(guān))能夠代理外部網(wǎng)絡(luò)上的主機(jī)對(duì)內(nèi)部網(wǎng)絡(luò)的訪問的代理服務(wù)方 式。反向代理技術(shù)可以被應(yīng)用于應(yīng)用層VPN(Virtual private network,虛擬專用網(wǎng))(如 SSL VPN)的Web代理模塊。反向代理技術(shù)的核心技術(shù)就是地址轉(zhuǎn)換。從普通用戶看來,反 向代理就像普通的Web服務(wù)器一樣。而反向代理所代理的每一個(gè)內(nèi)網(wǎng)Web服務(wù)器(簡(jiǎn)稱內(nèi) 網(wǎng)服務(wù)器)都好像是反向代理服務(wù)器中的一個(gè)目錄。進(jìn)行地址轉(zhuǎn)換就需要對(duì)內(nèi)網(wǎng)服務(wù)器響 應(yīng)中的HTML頁面里的鏈接進(jìn)行改寫。一般的鏈接改寫方式有如下幾種直接改寫,根據(jù)正 則表達(dá)式改寫,通過HTML解析模塊改寫。而目前的鏈接改寫方式主要集中在代理服務(wù)器或 代理網(wǎng)關(guān)上,由代理服務(wù)器或代理網(wǎng)關(guān)的鏈接改寫模塊提供相應(yīng)的改寫能力?,F(xiàn)有的鏈接改寫方式有以下不足(1)由于鏈接改寫主要在代理服務(wù)器或代理網(wǎng)關(guān)上完成,所以會(huì)占用代理服務(wù)器 或代理網(wǎng)關(guān)的CPU、內(nèi)存等資源。(2)根據(jù)HTTP協(xié)議的要求,需要將HTML頁面的大小記錄在請(qǐng)求頭的 Content-length頭域中,所以完成HTML鏈接改寫后,還需要計(jì)算其改寫后的內(nèi)容大小,并 相應(yīng)的修改Content-length頭域的值,這就需要緩存整個(gè)HTML頁面。(3)由于以上兩點(diǎn),代理服務(wù)器或代理網(wǎng)關(guān)的轉(zhuǎn)發(fā)速度勢(shì)必會(huì)受到影響。
發(fā)明內(nèi)容
本發(fā)明要解決的技術(shù)問題就是提出一種反向Web代理的鏈接改寫方法,解決現(xiàn)有 技術(shù)中由于鏈接改寫主要在代理服務(wù)器或代理網(wǎng)關(guān)上完成,而導(dǎo)致代理服務(wù)器或代理網(wǎng)關(guān) 的轉(zhuǎn)發(fā)速度受到影響的問題,能夠提高代理服務(wù)器或代理網(wǎng)關(guān)的處理速度。為了解決上述技術(shù)問題,本發(fā)明提供一種反向Web代理的鏈接改寫方法,包括代理服務(wù)器或代理網(wǎng)關(guān)將客戶端鏈接改寫的執(zhí)行代碼插入到內(nèi)網(wǎng)服務(wù)器的響應(yīng) 頁面,發(fā)送給客戶端;客戶端執(zhí)行所述執(zhí)行代碼,即進(jìn)行了鏈接改寫。進(jìn)一步地,上述鏈接改寫方法還可具有以下特點(diǎn)代理服務(wù)器或代理網(wǎng)關(guān)將執(zhí)行代碼插入到內(nèi)網(wǎng)服務(wù)器的響應(yīng)頁面,發(fā)送給客戶端 的步驟執(zhí)行之前,還執(zhí)行向內(nèi)網(wǎng)服務(wù)器轉(zhuǎn)發(fā)客戶端發(fā)送的請(qǐng)求;接收到內(nèi)網(wǎng)服務(wù)器的響應(yīng);拼裝客戶端鏈接改寫的執(zhí)行代碼。
4
進(jìn)一步地,上述鏈接改寫方法還可具有以下特點(diǎn)所述代理服務(wù)器或代理網(wǎng)關(guān)拼裝客戶端鏈接改寫的執(zhí)行代碼的步驟具體包括代理服務(wù)器或代理網(wǎng)關(guān)使用自身的地址拼裝客戶端鏈接改寫的正則表達(dá)式;根據(jù)正則表達(dá)式拼裝鏈接改寫的執(zhí)行代碼。進(jìn)一步地,上述鏈接改寫方法還可具有以下特點(diǎn)代理服務(wù)器或代理網(wǎng)關(guān)拼裝客戶端鏈接改寫的正則表達(dá)式的步驟具體包括拼裝針對(duì)HTML頁面中絕對(duì)路徑的URL的正則表達(dá)式;拼裝針對(duì)HTML頁面中相對(duì)路徑的URL的正則表達(dá)式。進(jìn)一步地,上述鏈接改寫方法還可具有以下特點(diǎn)所述執(zhí)行代碼使用鏈接改寫函數(shù)表示。進(jìn)一步地,上述鏈接改寫方法還可具有以下特點(diǎn)代理服務(wù)器或代理網(wǎng)關(guān)將執(zhí)行代碼插入到內(nèi)網(wǎng)服務(wù)器的響應(yīng)頁面,發(fā)送給客戶端 的步驟具體包括將執(zhí)行代碼插入到內(nèi)網(wǎng)服務(wù)器的響應(yīng)頁面;在所述響應(yīng)頁面中插入執(zhí)行所述執(zhí)行代碼的調(diào)用信息;計(jì)算并修改Content-length頭域值;
發(fā)送所述響應(yīng)頁面給客戶端。進(jìn)一步地,上述鏈接改寫方法還可具有以下特點(diǎn)發(fā)送所述響應(yīng)頁面給客戶端的步驟具體包括發(fā)送修改了 Content-length頭域的HTTP響應(yīng)頭;發(fā)送插入了客戶端鏈接改寫的執(zhí)行代碼的HTML頁面內(nèi)容;發(fā)送后續(xù)的HTML頁面內(nèi)容。進(jìn)一步地,上述鏈接改寫方法還可具有以下特點(diǎn)所述客戶端先加載所述響應(yīng)頁面,根據(jù)響應(yīng)頁面中的所述調(diào)用信息,執(zhí)行所述執(zhí) 行代碼。進(jìn)一步地,上述鏈接改寫方法還可具有以下特點(diǎn)所述客戶端執(zhí)行所述執(zhí)行代碼的步驟具體包括改寫響應(yīng)頁面A標(biāo)簽后的href鏈接;改寫響應(yīng)頁面Script標(biāo)簽后的src鏈接;改寫響應(yīng)頁面Link標(biāo)簽后的href鏈接;改寫響應(yīng)頁面IMG標(biāo)簽后的src鏈接;改寫響應(yīng)頁面Form標(biāo)簽后的action鏈接。進(jìn)一步地,上述鏈接改寫方法還可具有以下特點(diǎn)所述執(zhí)行代碼為腳本。本發(fā)明與現(xiàn)有的反向Web代理的鏈接改寫方法相比,代理服務(wù)器或代理網(wǎng)關(guān)的轉(zhuǎn) 發(fā)速度更快,鏈接改寫占用的內(nèi)存和CPU等資源更少,由以下幾個(gè)方面體現(xiàn)(1)只需在HTML頁面開始部分插入客戶端鏈接改寫的執(zhí)行代碼;(2)插入客戶端鏈接改寫的執(zhí)行代碼并修改內(nèi)網(wǎng)服務(wù)器響應(yīng)的Content-length 頭域后,就無需緩存HTML頁面內(nèi)容,讀寫效率高。
圖1為本發(fā)明實(shí)施例的網(wǎng)絡(luò)拓?fù)涫疽鈭D;圖2為本發(fā)明實(shí)施例的鏈接改寫的具體實(shí)施流程圖。
具體實(shí)施例方式在本發(fā)明中,代理服務(wù)器或代理網(wǎng)關(guān)將客戶端鏈接改寫的執(zhí)行代碼插入到內(nèi)網(wǎng)服 務(wù)器的響應(yīng)頁面,發(fā)送給客戶端;客戶端執(zhí)行所述執(zhí)行代碼,即進(jìn)行了鏈接改寫。下面結(jié)合附圖及具體實(shí)施例對(duì)本發(fā)明進(jìn)行詳細(xì)說明。如圖1所示,為本發(fā)明實(shí)施例使用的網(wǎng)絡(luò)拓?fù)涫疽鈭D。反向Web代理系統(tǒng)中的報(bào) 文格式符合標(biāo)準(zhǔn)的HTTP協(xié)議(其中客戶端和代理網(wǎng)關(guān)之間的連接可以是建立在SSL協(xié)議 之上的安全連接)。在實(shí)施例中并發(fā)訪問的客戶端瀏覽器可以有多個(gè),從而對(duì)代理網(wǎng)關(guān)的處 理能力有較高的要求。按照?qǐng)D1所示的網(wǎng)絡(luò)拓?fù)浣Y(jié)構(gòu),假設(shè)代理網(wǎng)關(guān)本身的URL是http:// reverse-proxy,而用戶想訪問的內(nèi)網(wǎng)月艮務(wù)器 URL 是 http//www. test, com/index, html, 就需要將用戶訪問的HTML頁面中的鏈接替換為http://reverse-proxy/www. test, com/ index, html,才能實(shí)現(xiàn)用戶通過代理網(wǎng)關(guān)對(duì)內(nèi)網(wǎng)服務(wù)器的訪問。圖2為實(shí)施例的鏈接改寫的具體實(shí)施流程圖,包括如下步驟步驟201,代理網(wǎng)關(guān)向內(nèi)網(wǎng)服務(wù)器轉(zhuǎn)發(fā)客戶端發(fā)送的請(qǐng)求;在本實(shí)施例中,代理網(wǎng)關(guān)收到從客戶端瀏覽器發(fā)來的請(qǐng)求如下GET/index. html HTTP/1. 1......Host :www. test, com然后,代理網(wǎng)關(guān)將該請(qǐng)求發(fā)送到被請(qǐng)求的內(nèi)網(wǎng)服務(wù)器;步驟202,代理網(wǎng)關(guān)接收到內(nèi)網(wǎng)服務(wù)器的響應(yīng);內(nèi)網(wǎng)服務(wù)器收到客戶端的請(qǐng)求后,回HTTP響應(yīng)(其中HTML頁面內(nèi)容包含在HTTP 響應(yīng)體內(nèi))如下HTTP/1. 1 200 OK......Content-Length 1467Connection :closeContent-Type :text/html ;charset = UTF-8<html>< ! -html 頁面內(nèi)容〉<head></head><body></body></html>
步驟203,代理網(wǎng)關(guān)拼裝客戶端鏈接改寫的執(zhí)行代碼;代理網(wǎng)關(guān)收到上述HTTP響應(yīng)后,使用自身的地址拼裝客戶端鏈接改寫的正則表 達(dá)式;根據(jù)正則表達(dá)式拼裝客戶端鏈接改寫的執(zhí)行代碼;該執(zhí)行代碼使用鏈接改寫函數(shù)表 示;其中,拼裝客戶端鏈接改寫的正則表達(dá)式具體包括
拼裝針對(duì)HTML頁面中絕對(duì)路徑的URL的正則表達(dá)式;拼裝針對(duì)HTML頁面中相對(duì)路徑的URL的正則表達(dá)式。本實(shí)施例中,拼裝客戶端鏈接改寫的執(zhí)行代碼(本例中使用的是JavaScript的偽 代碼),如下〈script type =" text/javascript “ >/*網(wǎng)關(guān)拼裝的客戶端鏈接改寫的執(zhí)行代碼*/function replace_link() {/*根據(jù)正則表達(dá)式拼裝客戶端鏈接改寫的執(zhí)行代碼*//*獲取A標(biāo)簽的對(duì)象集合。*/objs = document. getElementsByTagName(“ K");/*遍歷A標(biāo)簽的對(duì)象集合*/for(i = 0 ;i < objs. length ;i+ = 1){/*根據(jù)客戶端鏈接改寫的正則表達(dá)式改寫A標(biāo)簽后的href鏈接*/}/*獲取SCRIPT標(biāo)簽的對(duì)象集合。*/objs = document. getElementsByTagName(“ SCRIPT");/*遍歷SCRIPT標(biāo)簽的對(duì)象集合*/for(i = 0 ;i < objs. length ;i+ = 1){/*根據(jù)客戶端鏈接改寫的正則表達(dá)式改寫SCRIPT標(biāo)簽后的src鏈接*/}/*獲取LINK標(biāo)簽的對(duì)象集合。*/objs = document. getElementsByTagName(“ LINK");/*遍歷LINK標(biāo)簽的對(duì)象集合*/for(i = 0 ;i < objs. length ;i+ = 1){/*根據(jù)客戶端鏈接改寫的正則表達(dá)式改寫LINK標(biāo)簽后的href鏈接 */
}/*獲取IMG標(biāo)簽的對(duì)象集合。*/objs = document. getElementsByTagName (“ IMG");/*遍歷IMG標(biāo)簽的對(duì)象集合*/for(i = 0 ;i < objs. length ;i+ = 1)
{/*根據(jù)客戶端鏈接改寫的正則表達(dá)式改寫IMG標(biāo)簽后的src鏈接 */}/*獲取FORM標(biāo)簽的對(duì)象集合。*/objs = document. getElementsByTagName(“ FORM");/*遍歷FORM標(biāo)簽的對(duì)象集合*/for(i = 0 ;i < objs. length ;i+ = 1){/*根據(jù)客戶端鏈接改寫的正則表達(dá)式改寫FORM標(biāo)簽后的action鏈 接*/}}〈/script〉步驟204,代理網(wǎng)關(guān)將所述執(zhí)行代碼插入到內(nèi)網(wǎng)服務(wù)器響應(yīng)的頁面中,以及,在所 述頁面中插入執(zhí)行所述執(zhí)行代碼的調(diào)用信息;代理網(wǎng)關(guān)拼裝完客戶端鏈接改寫的執(zhí)行代碼后,便將其插入到從內(nèi)網(wǎng)服務(wù)器收到 的HTTP響應(yīng)的HTML頁面<html>標(biāo)簽后,并插入執(zhí)行所述執(zhí)行代碼的調(diào)用信息,使客戶端 根據(jù)所述調(diào)用信息執(zhí)行所述執(zhí)行代碼,在本例中,即在客戶端頁面加載時(shí),客戶端根據(jù)所述 調(diào)用信息執(zhí)行所述鏈接改寫函數(shù),本例中將其添加到<body>標(biāo)簽后,修改后標(biāo)簽內(nèi)容如 下〈body onload = “ replace_link();‘‘ >在進(jìn)行插入內(nèi)容的同時(shí),還需要記錄插入內(nèi)容的長(zhǎng)度;步驟205,查找HTTP響應(yīng)頭,看是否有Content-Length頭域,若有,則執(zhí)行步驟 206,否則,執(zhí)行207 ;步驟206,計(jì)算并修改Content-length頭域值;本例中Content-Length頭域值是1467,假設(shè)我們插入的客戶端執(zhí)行代碼的長(zhǎng)度 是100字節(jié),那么就需要將Content-Length頭域值修改為1567 ;步驟207,代理網(wǎng)關(guān)將插入客戶端鏈接改寫的執(zhí)行代碼的響應(yīng)頁面發(fā)送給客戶端 瀏覽器;其中,發(fā)送的過程包括發(fā)送HTTP響應(yīng)頭、發(fā)送插入客戶端鏈接改寫的執(zhí)行代碼 的HTML頁面內(nèi)容、發(fā)送后續(xù)的HTML頁面內(nèi)容;在這里,代理網(wǎng)關(guān)無須緩存后續(xù)的HTML頁面內(nèi)容,直接將其發(fā)送即可;步驟208,客戶端瀏覽器收到完整的HTTP響應(yīng)后,在加載HTML頁面的時(shí)候,根據(jù)所 述執(zhí)行代碼的調(diào)用信息就會(huì)自動(dòng)執(zhí)行客戶端鏈接改寫的執(zhí)行代碼,完成鏈接的改寫工作;其中,鏈接的改寫工作具體包括改寫響應(yīng)頁面A標(biāo)簽后的href鏈接;改寫響應(yīng)頁面Script標(biāo)簽后的src鏈接;改寫響應(yīng)頁面Link標(biāo)簽后的href鏈接;
8
改寫響應(yīng)頁面IMG標(biāo)簽后的src鏈接;改寫響應(yīng)頁面Form標(biāo)簽后的action鏈接。上述實(shí)施例是以代理網(wǎng)關(guān)為例進(jìn)行的描述,可以將代理網(wǎng)關(guān)替換成代理服務(wù)器, 其鏈接改寫的具體實(shí)現(xiàn)方式與代理網(wǎng)關(guān)相同,此處不再贅述。當(dāng)然,本發(fā)明還可有其它多種實(shí)施例,在不背離本發(fā)明精神及其實(shí)質(zhì)的情況下,熟 悉本領(lǐng)域的技術(shù)人員當(dāng)可根據(jù)本發(fā)明作出各種相應(yīng)的改變和變形,但這些相應(yīng)的改變和變 形都應(yīng)屬于本發(fā)明所附的權(quán)利要求的保護(hù)范圍。
9
權(quán)利要求
一種反向Web代理的鏈接改寫方法,包括代理服務(wù)器或代理網(wǎng)關(guān)將客戶端鏈接改寫的執(zhí)行代碼插入到內(nèi)網(wǎng)服務(wù)器的響應(yīng)頁面,發(fā)送給客戶端;客戶端執(zhí)行所述執(zhí)行代碼,即進(jìn)行了鏈接改寫。
2.如權(quán)利要求1所述的鏈接改寫方法,其特征在于,代理服務(wù)器或代理網(wǎng)關(guān)將執(zhí)行代碼插入到內(nèi)網(wǎng)服務(wù)器的響應(yīng)頁面,發(fā)送給客戶端的步 驟執(zhí)行之前,還執(zhí)行向內(nèi)網(wǎng)服務(wù)器轉(zhuǎn)發(fā)客戶端發(fā)送的請(qǐng)求; 接收到內(nèi)網(wǎng)服務(wù)器的響應(yīng); 拼裝客戶端鏈接改寫的執(zhí)行代碼。
3.如權(quán)利要求2所述的鏈接改寫方法,其特征在于,所述代理服務(wù)器或代理網(wǎng)關(guān)拼裝客戶端鏈接改寫的執(zhí)行代碼的步驟具體包括 代理服務(wù)器或代理網(wǎng)關(guān)使用自身的地址拼裝客戶端鏈接改寫的正則表達(dá)式; 根據(jù)正則表達(dá)式拼裝鏈接改寫的執(zhí)行代碼。
4.如權(quán)利要求3所述的鏈接改寫方法,其特征在于,代理服務(wù)器或代理網(wǎng)關(guān)拼裝客戶端鏈接改寫的正則表達(dá)式的步驟具體包括 拼裝針對(duì)HTML頁面中絕對(duì)路徑的URL的正則表達(dá)式; 拼裝針對(duì)HTML頁面中相對(duì)路徑的URL的正則表達(dá)式。
5.如權(quán)利要求3所述的鏈接改寫方法,其特征在于, 所述執(zhí)行代碼使用鏈接改寫函數(shù)表示。
6.如權(quán)利要求1所述的鏈接改寫方法,其特征在于,代理服務(wù)器或代理網(wǎng)關(guān)將執(zhí)行代碼插入到內(nèi)網(wǎng)服務(wù)器的響應(yīng)頁面,發(fā)送給客戶端的步 驟具體包括將執(zhí)行代碼插入到內(nèi)網(wǎng)服務(wù)器的響應(yīng)頁面; 在所述響應(yīng)頁面中插入執(zhí)行所述執(zhí)行代碼的調(diào)用信息; 計(jì)算并修改Content-length頭域值; 發(fā)送所述響應(yīng)頁面給客戶端。
7.如權(quán)利要求6所述的鏈接改寫方法,其特征在于, 發(fā)送所述響應(yīng)頁面給客戶端的步驟具體包括 發(fā)送修改了 Content-length頭域的HTTP響應(yīng)頭; 發(fā)送插入了客戶端鏈接改寫的執(zhí)行代碼的HTML頁面內(nèi)容; 發(fā)送后續(xù)的HTML頁面內(nèi)容。
8.如權(quán)利要求6所述的鏈接改寫方法,其特征在于,所述客戶端先加載所述響應(yīng)頁面,根據(jù)響應(yīng)頁面中的所述調(diào)用信息,執(zhí)行所述執(zhí)行代碼。
9.如權(quán)利要求1所述的鏈接改寫方法,其特征在于, 所述客戶端執(zhí)行所述執(zhí)行代碼的步驟具體包括 改寫響應(yīng)頁面A標(biāo)簽后的href鏈接;改寫響應(yīng)頁面Script標(biāo)簽后的src鏈接;改寫響應(yīng)頁面Link標(biāo)簽后的href鏈接;改寫響應(yīng)頁面IMG標(biāo)簽后的src鏈接;改寫響應(yīng)頁面Form標(biāo)簽后的action鏈接。
10.如權(quán)利要求1 9所述的鏈接改寫方法,其特征在于,所述執(zhí)行代碼為腳本。
全文摘要
本發(fā)明公開了一種反向Web代理的鏈接改寫方法,包括代理服務(wù)器或代理網(wǎng)關(guān)將客戶端鏈接改寫的執(zhí)行代碼插入到內(nèi)網(wǎng)服務(wù)器的響應(yīng)頁面,發(fā)送給客戶端;客戶端執(zhí)行所述執(zhí)行代碼,即進(jìn)行了鏈接改寫。本發(fā)明與現(xiàn)有的反向Web代理的鏈接改寫方法相比,代理服務(wù)器或代理網(wǎng)關(guān)的轉(zhuǎn)發(fā)速度更快,鏈接改寫占用的內(nèi)存和CPU等資源更少。
文檔編號(hào)H04L29/12GK101902485SQ20091008502
公開日2010年12月1日 申請(qǐng)日期2009年5月27日 優(yōu)先權(quán)日2009年5月27日
發(fā)明者張博, 蔣磊 申請(qǐng)人:北京啟明星辰信息技術(shù)股份有限公司;北京啟明星辰信息安全技術(shù)有限公司