在 Go 代碼中如何綁定 Host?

閱讀本文大概需要 5 分鐘。

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

剛好前兩天,羣裏也有人問類似的問題

本文示例:

需求:需要請求服務器上的 testhost.txt 資源。

1、Linux Shell 的解決方案

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 = "http://studygolang.com/testhost.txt",都無法請求到資源(沒有綁定 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 中獲取。

我是 polarisxu,北大碩士畢業,曾在 360 等知名互聯網公司工作,10 多年技術研發與架構經驗!2012 年接觸 Go 語言並創建了 Go 語言中文網!著有《Go 語言編程之旅》、開源圖書《Go 語言標準庫》等。

堅持輸出技術(包括 Go、Rust 等技術)、職場心得和創業感悟!歡迎關注「polarisxu」一起成長!也歡迎加我微信好友交流:gopherstudio

本文由 Readfog 進行 AMP 轉碼,版權歸原作者所有。
來源https://mp.weixin.qq.com/s/iZ_ntmFcMEBdb1LHGTd5dg