Go 程式碼中如何繫結 Host
在公司內部,為了安全,可能會有域名是需要繫結 host 才能訪問的,如果是通過瀏覽器訪問,我們會修改本機的 hosts 檔案;然而,如果是要通過程式訪問這樣的域名,我們是否依然必須繫結 host 呢?答案當然是否定的,而且,依賴本地繫結的 host,程式到其他機器部署,也必須在那臺機器繫結 host,如果機器很多呢?
剛好前兩天,群裡也有人問類似的問題
本文示例:
- IP:192.168.1.102,也就是說需要訪問這臺機器上的資源
- 域名:studygolang.com,nginx 配置的虛擬主機
- url path:/testhost.txt,內容是:Welcome to studygolang.com
需求:需要請求伺服器上的 testhost.txt 資源。
Linux 下的 curl 程式可以繫結 host,因此,在 shell 中可以很簡單的實現,如:curl -H "Host:studygolang.com" http://192.168.1.102/testhost.txt。
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);
由於 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)) }
不管是什麼方式、什麼語言,歸根結底,需要告知伺服器請求的是哪個 Host,這個是 HTTP 協議的 Host 頭。如果不手動設定 Host 頭,則會從請求的 url 中獲取。
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/69901823/viewspace-2793410/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- Grails中如何繫結引數AI
- Netty ServerBootstrap 繫結多個埠(程式碼示例)NettyServerboot
- 阿里雲如何繫結域名(阿里雲域名如何繫結ip)阿里
- GO web程式代理繫結域名非常頻繁404的問題GoWeb
- 執行緒繫結cpu核心的程式碼研究執行緒
- 如何在原生微信小程式中實現資料雙向繫結微信小程式
- 一文了解vue中watcher資料雙向繫結原理(附程式碼)Vue
- java中的靜態繫結與動態繫結Java
- 介面引數繫結, 公共處理程式碼生成工具
- 如何實現VM框架中的資料繫結框架
- vue 如何在迴圈中繫結v-modelVue
- 關於 Go 程式碼結構的思考Go
- python tkinter如何繫結事件?Python事件
- ROS指令碼ip-mac繫結 批次繫結ip和macROS指令碼Mac
- 在winform中如何實現雙向資料繫結?ORM
- 如何在 .Net 7 中將 Query 繫結到陣列陣列
- vue資料繫結原始碼Vue原始碼
- 微信小程式事件繫結微信小程式事件
- PbootCMS授權碼設定,PbootCMS如何繫結多個域名boot
- go程式結構Go
- Go 語言如何解決程式碼耦合Go
- WPF 介面如何繫結Command
- [轉帖]Redis如何繫結CPURedis
- 原始碼分析:vue和react元件事件繫結中的this原始碼VueReact元件事件
- MVVM雙向繫結機制的原理和程式碼實現MVVM
- EngJS(超輕量) 中資料雙向繫結如何使用JS
- 教你如何在.Net 7中將Query繫結到陣列陣列
- JS中this的繫結規則JS
- JavaScript中this的繫結規則JavaScript
- 引數繫結在PHP程式碼測試中的重要作用與應用場景PHP
- go 中 sort 如何排序,原始碼解讀Go排序原始碼
- 微信怎麼繫結手機號碼?微信繫結手機號碼的步驟
- 如何在路由繫結中使用 IParsable路由
- 從原始碼分析 SpringBoot 的 LoggingSystem → 它是如何繫結日誌元件的原始碼Spring Boot元件
- Host是什麼?如何設定host檔案?
- 關於JavaScript中this的軟繫結JavaScript
- Laravel 中延時繫結的理解Laravel
- vue中select繫結多個值Vue