The Will Will Web

記載著 Will 在網路世界的學習心得與技術分享

如何從瀏覽器的位址列(Address Bar)隱藏你正在瀏覽的網址

我們有個客戶的 ASP.NET 網站,主網站就架在網站的根目錄下 ( http://www.example.com/ ),而網站下又設定了 2 個子網站虛擬目錄 ( http://www.example.com/Site1/http://www.example.com/Site2/ ),彼此相依存在著。不過,根目錄下的主網站改版了,但虛擬目錄下的子網站並未改版,這導致子網站無法正常執行了!所以當改版完成後,只能將原本的主網站改另一個 Domain Name ( http://www2.example.com ) 才能讓原本的子網站繼續運作,但這時候客戶卻抱怨說為什麼子網站的網址變了,要求我們將網址回覆到原本的樣子。

這個事件最主要的抱怨點有如下幾點:

  1. 由於之前對外的文宣都是主打原本的網址,如今改變了會導致使用者無法連結到正確的網站。
  2. 之前有些已經加入我的最愛的人若下次進來可能會看不到網頁。
  3. 新的網址「感覺很怪」,一定要我們改回來。

那好吧,只好全部改回來,不過在技術上是有困難的(並非做不到),因為若要將原本的子網站放回去現在新的主網站內,勢必要修改許多子網站內的程式,或修正 web.config 設定檔才能正確無誤的轉移回來,不過因為新���的架構不同,硬要這樣整合未來整個網站只會越來越亂,日後維護不易,所以我想了幾個可行的方法:

1. 採用最原始的「隱藏網址」作法,使用 FRAME 標籤

<html>
<head>
    <title>目的網站的標題要手動設定在此</title>
</head>
<frameset border="0" rows="100%,*" frameborder="no" margintop="0" marginright="0"
          marginbottom="0" marginleft="0">
    <frame src="http://www2.example.com/Site1/" scrolling="auto" 
           frameborder="no" border="0" noresize="noresize" />
    <frame topmargin="0" marginwidth="0" marginheight="0" 
           scrolling="no" frameborder="no" border="0" noresize="noresize" />
</frameset>
</html>

2. 採用前幾天介紹的 .NET URL Rewriter and Reverse Proxy 元件進行 Reverse Proxy 設定

設定方式很簡單,如下:

RewriteEngine on
RewriteRule ^/Site1/(.*)$ http://www2.example.com/Site1/$1 [P,NC]
其中的 P 就代表 Proxy 的意思,雖然跨網站無法使用 URL Rewriting 功能,但 .NET URL Rewriter and Reverse Proxy 依然可以支援 Reverse Proxy 功能,這也是我最愛他的地方。

我個人比較偏愛第 2 種作法,但魔鬼總是會出現在枝微末節的地方,我們的其中一個子網站 ( http://www.example.com/Site1/ ) 當中有幾支程式採用了 ASP.NET 2.0 的 Callback 技巧,且這幾支程式剛好都會「認網址」,也就是說網址跟原本的不相同就會發生 JavaScript Error 導致無法正常瀏覽。

採用 URL Rewrite 或 Reverse Proxy 架構對「原始的程式」來說,其實 ASP.NET 程式收到的 QueryString 或原本的伺服器變數(Server Variables)都是不變的。例如說:我子網站真正的網址是 http://www2.example.com/Site1/ABC.aspx?id=TEST,雖然透過 Reverse Proxy 網址變成 http://www.example.com/Site1/ABC.aspx?id=TEST,不過對 ABC.aspx 這支程式來說,Request.Url 依然是 http://www2.example.com/Site1/ABC.aspx?id=TEST 喔!但是對 JavaScript 來說,卻是 http://www.example.com/Site1/ABC.aspx?id=TEST。所以各位對 Client 與 Server 之間的差異一定要精準的釐清。

其實我還有想到另一個天兵的方法,就是跟客戶比眼力!也就是「技巧性」的把網站網址改成類似以下的網站連結:

這個方法太瞎了,不過應該可以檔一段時間,呵呵~   XD