在公司内部,为了安全,可能会有域名是需要绑定 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相关推荐

  1. 【Android NDK 开发】在 C 代码中获取 Android 系统信息 ( NDK 项目创建 | NDK 配置 | 获取 Android 系统版本号 )

    文章目录 I . 创建 NDK 项目 II . NDK 项目 相关配置 III . NDK 中获取 Android 版本号 IV . 使用 __system_property_get 可获取的参数 I ...

  2. 测试nginx网站代码_在40行以下代码中使用NGINX进行A / B测试

    测试nginx网站代码 by Nitish Phanse 由Nitish Phanse 在40行以下代码中使用NGINX进行A / B测试 (A/B testing with NGINX in und ...

  3. 在Rust代码中编写Python是种怎样的体验?

    作者 | Mara Bos,Rust资深工程师 译者 | Arvin,编辑 | 屠敏 来源 | CSDN(ID:CSDNnews) 大约一年前,我发布了一个名为inline-python(https: ...

  4. 在Visual Studio代码中显示空白字符

    本文翻译自:Show whitespace characters in Visual Studio Code Is it possible to show whitespace characters, ...

  5. Visual Studio代码中的多个游标[关闭]

    本文翻译自:Multiple cursors in Visual Studio Code [closed] How can you create multiple cursors when editi ...

  6. redis高并发原理_Java中的42行代码中的URL缩短服务— Java(?!)Spring Boot + Redis...

    redis高并发原理 显然,编写URL缩短服务是新的"世界,您好! "在物联网/微服务/时代的世界中. 一切始于在45行Scala中的URL缩短服务-整洁的Scala,以Spray ...

  7. 基于继承类的属性模版中无法绑定的原因和解决方法

    原文:基于继承类的属性模版中无法绑定的原因和解决方法 这个的晚上想学学WPF 做一个类似于ERP 左边菜单.构思一下思路 ...... 创建一个类基于Expander类. 1 public class ...

  8. 在C#代码中获取Silverlight的初始化initparams参数

    今天学习内容是,我们将利用Silverlight给我们提供的一个便利的方法来实现: 当一个web page加裁时,把指定参数(或信息)从 web page传递到silverlight中,这就是init ...

  9. WPF 的 ElementName 在 ContextMenu 中无法绑定成功?试试使用 x:Reference!

    原文:WPF 的 ElementName 在 ContextMenu 中无法绑定成功?试试使用 x:Reference! 版权声明:本作品采用知识共享署名-非商业性使用-相同方式共享 4.0 国际许可 ...

最新文章

  1. SA-SSD:阿里达摩院最新3D检测力作(CVPR2020)
  2. CentOS6.5下做DNS服务器
  3. 云安全趋势:IaaS?谢了,我要 PaaS
  4. CCS编译出错:缺少头文件的解决办法
  5. 笑死!“盒马”把自己的ID给玩没了...
  6. 用matlab 拟合实数解,求大神指点matlab用拟合的方式解延迟微分方程组参数
  7. CV2摄像头人脸、人眼、微笑等检测
  8. 一个前端框架应该有的一些公共函数
  9. git提交到github总是要输入密码_GitHub不为人知的秘密
  10. centos python_在centos上配置python的虚拟开发环境
  11. .Net Core中Dapper的使用详解
  12. python装饰器应用_Python装饰器实现方法及应用场景详解
  13. 使用plsql管理oracle数据库连接,使用PLSQL连接远程oracle数据库
  14. python 漏洞扫描器_自动扫描全网漏洞的扫描器
  15. 机器人庄园作文_300个字我的梦想作文
  16. Java程序员如何通过阿里、百度的招聘面试
  17. hibernatexml方式和注解方式实现单实体映射和继承关系映射,eclipse实现
  18. 学习型红外遥控器的FPGA设计与实现
  19. [附源码]java毕业设计哈金院快递驿站管理信息系统
  20. 使用console.time打印代码运行时间

热门文章

  1. 订单管理之获取订单表详情数据数据
  2. 多任务的介绍(并发、并行)
  3. 收藏 | CNN的一些可视化方法!
  4. 三分钟教你快速选择机器视觉传感器
  5. 超牛EXCEL操作技巧,用的好,会涨工资哦
  6. php页面最大执行时间 set_time_limit函数不起作用
  7. 从 webpack 到全面拥抱 Parcel #1 探索 Parcel
  8. 基于inotify的文件监控方案
  9. BeanShell变量的基本范围
  10. 前后台使用ajax传list的时候,用value[] 获取值