分類
ASP

自訂host的方式進行webrequest (ASP)

XML HTTPRequest , 是 ajax 的一個重要元件, 不過一直有一個問題就是指定 Request Header 的這個部分, 在 XML HTTPReqeust 裡, 使用 setRequestHeader 的這些 header 有些是可以指定的, 有些是似乎是 read-only 的, 這裡要談的就是 host 這個標題.

在 client side 的狀況下, 這件事似乎是完全不用考慮的, 因為 client-side javascript 在瀏覽器的控制下, 本來就不允許做 crossdomain 的 access 的(這是基於安全性的考量), 即使是相同子網域也一樣, 相關資料可以參考: Javascript的同一父網域下的crossdomain問題. 不過若是在 server side 就不是這樣了, 在 server side 有時可能需要做為 client 的 remoting 或 gateway 的關係, 也會利用相同的方式進行 http reqeust, 在 asp 程式碼中, 若是需要做這個功能, 一樣是起 MSXML2.XMLHTTP 這組 xml webreqeust, 不過仍有指定 host header 的問題, 即使使用了 setRequestHeader “Host”, “bbb.com.tw” 的方式, 仍無法變更原來在 Open 方法內使用的 url 指定為 http://10.10.10.10/xxx 中的 10.10.10.10 的 host header , 不過用 setRequestHeader “Host”, “bbb.com.tw” 也不會有任何錯誤.

這裡將介紹另一組 api 供類似功能, 但又可以指定 Host Header 功能的一組元件, Windows HTTP Services, 這組元件用法幾乎和 MSXML2.XMLHTTP 完全相同, 而且又可以指定 Host, 所以在使用上可以有更多的應用, 例如多主機架構下, 指定 ip 方式訪問主機, 並帶上對應的主機標題(Host Header), 如此一來便能在指定 ip 下的 http 訪問又能加上 host header.

以下為範例程式碼:

Set WinHttpReq = CreateObject("WinHttp.WinHttpRequest.5.1")
WinHttpReq.Open "GET", "http://192.168.1.1/test.php", false
WinHttpReq.SetRequestHeader "Host", "myurl.com.tw"
WinHttpReq.Send
httprsp = WinHttpReq.ResponseText
Set WinHttpReq = Nothing

這個最大的用途是做測試環境及主機標題限制狀況下使用, 又或多主機(平衡負載)對應時, 要指定訪問固定主機的頁面時會使用到.