Go 程式碼中如何繫結 Host

roc_guo發表於2021-09-24

Go 程式碼中如何繫結 HostGo 程式碼中如何繫結 Host

在公司內部,為了安全,可能會有域名是需要繫結 host 才能訪問的,如果是通過瀏覽器訪問,我們會修改本機的 hosts 檔案;然而,如果是要通過程式訪問這樣的域名,我們是否依然必須繫結 host 呢?答案當然是否定的,而且,依賴本地繫結的 host,程式到其他機器部署,也必須在那臺機器繫結 host,如果機器很多呢?

剛好前兩天,群裡也有人問類似的問題

本文示例:

  • IP:192.168.1.102,也就是說需要訪問這臺機器上的資源
  • 域名:studygolang.com,nginx 配置的虛擬主機
  • url path:/testhost.txt,內容是:Welcome to studygolang.com
  • 需求:需要請求伺服器上的 testhost.txt 資源。

    1、    的解決方案

    Linux 下的 curl 程式可以繫結 host,因此,在 shell 中可以很簡單的實現,如:curl -H "Host:studygolang.com" http://192.168.1.102/testhost.txt。

    2、PHP 的解決方案

    1)通過 curl 擴充套件實現

$ch = curl_init(); 
curl_setopt($ch, CURLOPT_HTTPHEADER, array('Host:studygolang.com')); 
curl_setopt($ch, CURLOPT_URL, 'http://192.168.1.102/testhost.txt'); 
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); 
$ret = curl_exec($ch); 
var_dump($ret);

2)不依賴 curl 擴充套件的方式

// Create a stream 
$opts = array( 
    'http'=>array( 
        'method'=>"GET", 
        'header'=>"Host:studygolang.com" 
    ) 
); 
 
$context = stream_context_create($opts); 
 
// Open the file using the HTTP headers set above 
$ret = file_get_contents('http://192.168.1.102/testhost.txt', false, $context); 
var_dump($ret);
3、Golang 的解決方案

由於 Go 標準庫實現了 http 協議,在 net/http 包中尋找解決方案。

一般的,請求一個 url,我們通過以下程式碼實現:

http.Get(url)

然而,針對本文說到的這種情況,無論 url = "http://192.168.1.102/testhost.txt" 還是 url = ",都無法請求到資源(沒有繫結 host 的情況)。

在 http 包中的 Request 結構中,有一個欄位:Host,我們可以參考上面兩種解決方案,設定 Host 的值。方法如下:

package main 
 
import ( 
    "net/http" 
    "io/ioutil" 
    "fmt" 
) 
 
func main() { 
    req, err := http.NewRequest("GET", "http://192.168.1.102/testhost.txt", nil) 
    if err != nil { 
        panic(err) 
    } 
    req.Host = "studygolang.com" 
    resp, err := http.DefaultClient.Do(req) 
    if err != nil { 
        panic(err) 
    } 
    defer resp.Body.Close() 
    body, err := ioutil.ReadAll(resp.Body) 
    if err != nil { 
        panic(err) 
    } 
    fmt.Println(string(body)) 
}
4、總結

不管是什麼方式、什麼語言,歸根結底,需要告知伺服器請求的是哪個 Host,這個是 HTTP 協議的 Host 頭。如果不手動設定 Host 頭,則會從請求的 url 中獲取。


來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/69901823/viewspace-2793410/,如需轉載,請註明出處,否則將追究法律責任。

相關文章