自拍偷在线精品自拍偷,亚洲欧美中文日韩v在线观看不卡

在 Go 代碼中如何綁定 Host?

開發(fā) 后端
在公司內部,為了安全,可能會有域名是需要綁定 host 才能訪問的,如果是通過瀏覽器訪問,我們會修改本機的 hosts 文件;然而,如果是要通過程序訪問這樣的域名,我們是否依然必須綁定 host 呢?

[[423284]]

在公司內部,為了安全,可能會有域名是需要綁定 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 Shell 的解決方案

Linux 下的 curl 程序可以綁定 host,因此,在 shell 中可以很簡單的實現(xiàn),如:curl -H "Host:studygolang.com" http://192.168.1.102/testhost.txt。

2、PHP 的解決方案

1)通過 curl 擴展實現(xiàn)

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

2)不依賴 curl 擴展的方式

  1. // Create a stream 
  2. $opts = array( 
  3.     'http'=>array( 
  4.         'method'=>"GET"
  5.         'header'=>"Host:studygolang.com" 
  6.     ) 
  7. ); 
  8.  
  9. $context = stream_context_create($opts); 
  10.  
  11. // Open the file using the HTTP headers set above 
  12. $ret = file_get_contents('http://192.168.1.102/testhost.txt'false, $context); 
  13. var_dump($ret); 

3、Golang 的解決方案

由于 Go 標準庫實現(xiàn)了 http 協(xié)議,在 net/http 包中尋找解決方案。

一般的,請求一個 url,我們通過以下代碼實現(xiàn):

  1. http.Get(url) 

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

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

  1. package main 
  2.  
  3. import ( 
  4.     "net/http" 
  5.     "io/ioutil" 
  6.     "fmt" 
  7.  
  8. func main() { 
  9.     req, err := http.NewRequest("GET""http://192.168.1.102/testhost.txt", nil) 
  10.     if err != nil { 
  11.         panic(err) 
  12.     } 
  13.     req.Host = "studygolang.com" 
  14.     resp, err := http.DefaultClient.Do(req) 
  15.     if err != nil { 
  16.         panic(err) 
  17.     } 
  18.     defer resp.Body.Close() 
  19.     body, err := ioutil.ReadAll(resp.Body) 
  20.     if err != nil { 
  21.         panic(err) 
  22.     } 
  23.     fmt.Println(string(body)) 

4、總結

 

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

 

責任編輯:武曉燕 來源: polarisxu
相關推薦

2024-03-19 14:15:48

Go程序os.Exit()

2010-07-30 10:37:23

Flex數(shù)據(jù)綁定

2020-08-20 08:23:52

VueDOM運算符

2023-12-21 07:06:32

Go編寫HTML

2025-02-12 11:06:24

Go函數(shù)MultiBytes

2011-05-30 17:31:51

Android 模擬SD卡

2021-11-02 11:31:47

Go代碼模式

2021-07-09 12:37:31

GoPython編程語言

2021-06-09 07:15:20

Go枚舉技巧

2009-12-24 16:57:53

WPF密碼

2020-06-28 08:10:00

GoGOSSAFUNC圖編程語言

2021-09-26 06:43:09

TCP連接Go

2023-11-02 10:32:27

GoGORM

2023-12-13 07:19:01

微服務架構Golang

2009-07-22 08:52:05

Scala動態(tài)綁定

2021-11-10 15:18:16

JavaGo命令

2014-04-09 09:32:24

Go并發(fā)

2024-02-19 07:40:10

2016-10-11 20:33:17

JavaScriptThisWeb

2024-02-26 00:00:00

GoSocket編程
點贊
收藏

51CTO技術棧公眾號