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

我們有個客戶的 ASP.NET 網站，主網站就架在網站的根目錄下 ( [http://www.example.com/](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](http://www.codeplex.com/urlrewriter) 依然可以支援 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，不過對](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。所以各位對](http://www.example.com/Site1/ABC.aspx?id=TEST。所以各位對) Client 與 Server 之間的差異一定要精準的釐清。

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

-   http://wwv.example.com/
-   http://wvw.example.com/
-   http://wvvw.example.com/
-   http://wwww.example.com/

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