Request 物件內含 Request.ServerVariables 集合,此集合包含了伺服器環境變數的值,這些環境變數涵蓋了用戶端和伺服器端的各種資訊。
例如,若要得知用戶端及伺服器端的 IP,可用下列方式取得:
- HTTP request 來源 IP: Request.ServerVariables("REMOTE_ADDR")
- HTTP request 伺服器 IP: Request.ServerVariables("LOCAL_ADDR")
- HTTP request 代理伺服器(含網域名稱及軟體名稱): Request.ServerVariables("HTTP_VIA")
- HTTP request 原始來源 IP: Request.ServerVariables("HTTP_X_FORWARDED_FOR")
範例如下:
上述範例的原始檔如下:
如果你得到的客戶端 IP 並不等於你的電腦的 IP,哪麼可能是你的瀏覽器被設定成經由代理伺服器(Proxy Server)來取得網頁,因此 Request.ServerVariables("REMOTE_ADDR") 就變成代理伺服器的 IP 了。在這種情況下,我們可由 Request.ServerVariables("HTTP_VIA") 來顯示所用到的代理伺服器,並由 Request.ServerVariables("HTTP_X_FORWARDED_FOR") 取得真正客戶端的 IP。當然,如果你的瀏覽器並沒有設定使用代理伺服器,那麼經由 Request 物件所抓到的變數 Request.ServerVariables("HTTP_VIA") 和 Request.ServerVariables("HTTP_X_FORWARDED_FOR") 都只是空字串而已。
一個簡單的應用,就是檢查來源 IP,而決定是否提供網頁瀏覽。例如,如果我們的線上教材只開放給清大的同學看,那我們就可以直接檢查原始來源 IP 是否為 140.114.xxx.xxx,若不是,則不傳送網頁,範例如下:
上述範例的原始檔如下:
與伺服器相關的資訊,可以列出如下:
- 伺服器網域名稱:Request.ServerVariables("SERVER_NAME")
- 伺服器埠號:Request.ServerVariables("SERVER_PORT")
- 伺服器協定:Request.ServerVariables("SERVER_PROTOCOL")
- 網頁伺服器軟體名稱:Request.ServerVariables("SERVER_SOFTWARE")
- 伺服器加密:Request.ServerVariables("SERVER_PORT_SECURE")
範例如下:
上述範例的原始檔如下:
與網頁路徑相關的資訊,可以列出如下:
- 伺服器根目錄的實體硬碟路徑:Request.ServerVariables("APPL_PHYSICAL_PATH")
- 網頁在實體硬碟的路徑:Request.ServerVariables("PATH_TRANSLATED")
- 網頁相對應於伺服器根目錄的路徑:Request.ServerVariables("PATH_INFO")
- 網頁相對應於伺服器根目錄的路徑:Request.ServerVariables("SCRIPT_NAME")
- 網頁相對應於伺服器根目錄的路徑:Request.ServerVariables("URL")
範例如下:
上述範例的原始檔如下:
在上述範例中,Request.ServerVariables("PATH_INFO")、Request.ServerVariables("SCRIPT_NAME") 和 Request.ServerVariables("URL") 都會回傳一樣的結果。
其他有用的資訊也都可以由 Request.ServerVariables 取得,例如:
- 連結至目前網頁的前一個網頁:Request.ServerVariables("HTTP_REFERER")
- 用戶端所用的瀏覽器:Request.ServerVariables("HTTP_USER_AGENT")
- 用戶端登錄至網頁的帳號:Request.ServerVariables("LOGON_USER")
範例如下:
上述範例的原始檔如下:
使用 Request.ServerVariables("HTTP_REFERER"),你可以得知下列事項:
- 你可以知道使用者是從哪一個友情贊助或廣告網頁連結而來,並進而知道你所花的廣告費有沒有物超所值。
- 你可以知道那個網頁在偷偷地直接連結到你的網頁。事實上,若有需要,你可以拒絕連結,並轉址到主要網頁。
若欲將 Request.ServerVariables 所有相關變數一次印出,可見下列範例:
上述範例的原始檔如下:
此原始檔包含了 listdict.inc,其原始檔案如下:
listdict.inc 包含兩個函數,分別用於對付 JScript 和 VBScript,可列印出任何 Dictionary 變數,例如上述範例的 Request.ServerVariables。在 JScript 的 listdict() 函數中,我們用到了 Enumerator 的物件,此物件是類似於 VBScript 的 Dictionary 變數,可用字串來索引另一個字串。
若要知道 Request.ServerVariables 所包含變數的意義,可以直接查看下列網頁:
http://www.devguru.com/index.asp?page=/technologies/asp/quickref/request_servervariables.html
瞭解並善用這些伺服器環境變數,可使妳的 Web 程式設計事半功倍。
上述印所有 Request.ServerVariables 的方法,是用 JScript 來達成,我們也可以使用 VBScript 來達到相同功能,請見範例程式碼「example/request/serverVariables_vbs.asp」,此程式碼也包含了相同的 listdict.inc,以便列出所有的伺服器變數。
JScript 程式設計與應用:用於伺服器端的 ASP 環境