2008年3月26日 星期三

HTTP_HOST 及 SERVER_NAME 的區別

當每次請求 HTTP_HOST 及 SERVER_NAME 的值總是一樣的,有沒有想過這兩個變數有什麼區別呢?

無意間在 Microsoft 針對 Microsoft Windows Server 2003 的一篇技術文件上提到了相關說明,以下為該說明概要︰






在您安裝此 Service Pack 或套用此 Hotfix, 必須在網站上設定 UseHostName 屬性或 SetHostName 屬性您是否要傳送之要求一個替代主機名稱。 依預設值, 與 HTTP_HOST 變數相同的值是傳送 SERVER_NAME 變數中。

注意︰如果您啟用一項下列設定值, IIS 通常會先將為 SERVER_NAME 變數的替代名稱。

為 UseHostName 屬性資料型別是布林值。 將 UseHostName 屬性指示 IIS 設定為永遠以完整電腦名稱取代 SERVER_NAME 變數。

您可以選擇性地, 設定 SetHostName 屬性。 為 SetHostName 屬性資料型別是字串。 如果您必須指定主機名稱與電腦名稱 (而不是使用 SetHostName 屬性。 SetHostName 屬性會假設您要此替代主機名稱。 SetHostName 屬性會導致 IIS 設定成忽略 UseHostName 設定。 您沒有以設定 UseHostName 屬性如果 SetHostName 屬性是存在。

Web 伺服器管理員可能會使用 Adsutil . vbs 工具來修改 UseHostName Metabase 屬性和 SetHostName Metabase 屬性。

資料來源︰Microsoft 技術資源服務:IP 位址會顯露在 IIS 6.0 中的 TCP 標頭中的 Content - 位置欄位

是不是覺得這段說明很艱深難懂,沒關係,因為您可能跟我一樣只是個應用程式設計者,而非 Server 管理者。其實只要注意幾個關鍵字不難理解,HTTP_HOST 及 SERVER_NAME 在某些情況下值是不相同的。

在 Microsoft Windows Server 2003 當 UseHostName 為 true,或者 SetHostName 設定了主機名稱,那麼 SERVER_NAME 的值將會是完整電腦名稱。

然而 HTTP_HOST 可以請求出非 80 port 的 SERVER_PORT,簡單來說在一般的情況下 HTTP_HOST 等於『SERVER_NAME:SERVER_PORT』。

以下在 ColdFusion 測試的結果,測試環境 ColdFusion 安裝在預設的 8500 port,請求的網址為 http://127.0.0.1:8500/。CGI 結構變數 Dump 出來結果如下︰

HTTP_HOST = 127.0.0.1:8500
SERVER_NAME = 127.0.0.1
SERVER_PORT = 8500

在 ColdFusion 的 CGI 結構變數相當於 PHP 的 $_SERVER 變數。

沒有留言: