Go 代码中如何绑定 Host
在公司内部,为了安全,可能会有域名是需要绑定 host 才能访问的,如果是通过浏览器访问,我们会修改本机的 hosts 文件;然而,如果是要通过程序访问这样的域名,我们是否依然必须绑定 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 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 中获取。
Go 代码中如何绑定 Host相关推荐
- 【Android NDK 开发】在 C 代码中获取 Android 系统信息 ( NDK 项目创建 | NDK 配置 | 获取 Android 系统版本号 )
文章目录 I . 创建 NDK 项目 II . NDK 项目 相关配置 III . NDK 中获取 Android 版本号 IV . 使用 __system_property_get 可获取的参数 I ...
- 测试nginx网站代码_在40行以下代码中使用NGINX进行A / B测试
测试nginx网站代码 by Nitish Phanse 由Nitish Phanse 在40行以下代码中使用NGINX进行A / B测试 (A/B testing with NGINX in und ...
- 在Rust代码中编写Python是种怎样的体验?
作者 | Mara Bos,Rust资深工程师 译者 | Arvin,编辑 | 屠敏 来源 | CSDN(ID:CSDNnews) 大约一年前,我发布了一个名为inline-python(https: ...
- 在Visual Studio代码中显示空白字符
本文翻译自:Show whitespace characters in Visual Studio Code Is it possible to show whitespace characters, ...
- Visual Studio代码中的多个游标[关闭]
本文翻译自:Multiple cursors in Visual Studio Code [closed] How can you create multiple cursors when editi ...
- redis高并发原理_Java中的42行代码中的URL缩短服务— Java(?!)Spring Boot + Redis...
redis高并发原理 显然,编写URL缩短服务是新的"世界,您好! "在物联网/微服务/时代的世界中. 一切始于在45行Scala中的URL缩短服务-整洁的Scala,以Spray ...
- 基于继承类的属性模版中无法绑定的原因和解决方法
原文:基于继承类的属性模版中无法绑定的原因和解决方法 这个的晚上想学学WPF 做一个类似于ERP 左边菜单.构思一下思路 ...... 创建一个类基于Expander类. 1 public class ...
- 在C#代码中获取Silverlight的初始化initparams参数
今天学习内容是,我们将利用Silverlight给我们提供的一个便利的方法来实现: 当一个web page加裁时,把指定参数(或信息)从 web page传递到silverlight中,这就是init ...
- WPF 的 ElementName 在 ContextMenu 中无法绑定成功?试试使用 x:Reference!
原文:WPF 的 ElementName 在 ContextMenu 中无法绑定成功?试试使用 x:Reference! 版权声明:本作品采用知识共享署名-非商业性使用-相同方式共享 4.0 国际许可 ...
最新文章
- SA-SSD:阿里达摩院最新3D检测力作(CVPR2020)
- CentOS6.5下做DNS服务器
- 云安全趋势:IaaS?谢了,我要 PaaS
- CCS编译出错:缺少头文件的解决办法
- 笑死!“盒马”把自己的ID给玩没了...
- 用matlab 拟合实数解,求大神指点matlab用拟合的方式解延迟微分方程组参数
- CV2摄像头人脸、人眼、微笑等检测
- 一个前端框架应该有的一些公共函数
- git提交到github总是要输入密码_GitHub不为人知的秘密
- centos python_在centos上配置python的虚拟开发环境
- .Net Core中Dapper的使用详解
- python装饰器应用_Python装饰器实现方法及应用场景详解
- 使用plsql管理oracle数据库连接,使用PLSQL连接远程oracle数据库
- python 漏洞扫描器_自动扫描全网漏洞的扫描器
- 机器人庄园作文_300个字我的梦想作文
- Java程序员如何通过阿里、百度的招聘面试
- hibernatexml方式和注解方式实现单实体映射和继承关系映射,eclipse实现
- 学习型红外遥控器的FPGA设计与实现
- [附源码]java毕业设计哈金院快递驿站管理信息系统
- 使用console.time打印代码运行时间