我們有個客戶的 ASP.NET 網站,主網站就架在網站的根目錄下 ( http://www.example.com/ ),而網站下又設定了 2 個子網站虛擬目錄 ( http://www.example.com/Site1/ 與 http://www.example.com/Site2/ ),彼此相依存在著。不過,根目錄下的主網站改版了,但虛擬目錄下的子網站並未改版,這導致子網站無法正常執行了!所以當改版完成後,只能將原本的主網站改另一個 Domain Name ( http://www2.example.com ) 才能讓原本的子網站繼續運作,但這時候客戶卻抱怨說為什麼子網站的網址變了,要求我們將網址回覆到原本的樣子。
這個事件最主要的抱怨點有如下幾點:
- 由於之前對外的文宣都是主打原本的網址,如今改變了會導致使用者無法連結到正確的網站。
- 之前有些已經加入我的最愛的人若下次進來可能會看不到網頁。
- 新的網址「感覺很怪」,一定要我們改回來。
那好吧,只好全部改回來,不過在技術上是有困難的(並非做不到),因為若要將原本的子網站放回去現在新的主網站內,勢必要修改許多子網站內的程式,或修正 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