在公司,为了安全起见,可能会有需要绑定主机才能访问的域名。如果是通过浏览器访问,我们会修改本机的hosts文件;但是,如果是通过程序访问这样的域名,还需要绑定主机吗?答案当然是否定的,而且,根据本地绑定的主机,程序部署到其他机器上,主机也必须绑定到那台机器上。如果有很多机器怎么办?就在前两天,群里也有人问过类似的问题。本文示例:IP:192.168.1.102,也就是说需要访问本机资源域名:studygolang.com,nginx配置的虚拟主机url路径:/testhost.txt,内容为:欢迎来到studygolang.com需求:需要在服务器上请求testhost.txt资源。1、LinuxShell的解决方法Linux下的curl程序可以绑定host,所以可以很方便的在shell中实现,如:curl-H"Host:studygolang.com"http://192.168.1.102/测试主机。TXT。2、PHP解决方案1)实现$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扩展//Createastream$opts=array('http'=>array('method'=>"GET",'header'=>"Host:studygolang.com"));$context=stream_context_create($opts);//OpenthefileusingtheHTTPheaderssetabove$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",不能请求资源(没有绑定主机)。在http包中的Request结构中,有一个字段:Host,我们可以参考上面两种方案来设置Host的值。方法如下:packagemainimport("net/http""io/ioutil""fmt")funcmain(){req,err:=http.NewRequest("GET","http://192.168.1.102/testhost.txt",nil)iferr!=nil{panic(err)}req.Host="studygolang.com"resp,err:=http.DefaultClient.Do(req)iferr!=nil{panic(err)}deferresp.Body.Close()body,err:=ioutil.ReadAll(resp.Body)iferr!=nil{panic(err)}fmt.Println(string(body))}4.总结不管是什么方法或者语言,在最后分析一下,需要告知服务器请求的是哪个Host,这个就是HTTP协议的Host头。如果没有手动设置Host头,将从请求的url中获取。
