httpclient与hertzclient在处理Host header时的差别

本文中的Host header、request.header.host、req.Header[“Host”]都指的是请求头中的“Host”字段。

问题提出

在请求转发的过程中,需要从原请求中拿到一些信息来构造新的转发出去的请求,其中就有Host header的问题。一开始我使用的是httpclient,复制请求头的逻辑就是清除一些字段后直接全部复制过去(Host header不在清除范围内),此时程序正常运行。

	c.Request.Header.VisitAll(func(key, value []byte) {
		req.Header.Add(string(key), string(value))
	})

当我将httpclient切换成hertzclient后,发现一模一样的复制请求头的逻辑遇到了404的错误。经过一番排查发现是httpclient和hertzclient两者对于request.header.host的处理方式不同。对于hertzclient来说,正确的方式应该是不复制请求头中的Host字段。

	c.Request.Header.VisitAll(func(key, value []byte) {
		if string(key) != "Host" {	  // hertz框架中的client不会更改header.Host,所以不能用原来的Host
			req.Header.Add(string(key), string(value))
		}
	})

httpclient

httpclient请求最终发送的 Host header 并不是取自 req.Header[“Host”],而是由 req.Host 字段决定,如果 req.Host 为空,则默认为 req.URL.Host。

所以说虽然我一开始直接把原始的、错误的 Host header 复制了过去,但是httpclient对请求的 Host header 进行了替换,没有用我设置的 Host header ,所以并没有出现问题。

hertzclient

hertzclient最后发送的 Host header 就是取自 req.Header[“Host”] 的,所以说当我将原来的 request.header.host 写到新请求中后,hertzclient发送请求直接使用的是我设置的 Host header ,所以出现404的问题。

如果说依然使用完整复制的方法,在最后需要用req.Header.SetHost()替换原始的、错误的 Host header 。注意不是req.SetHost(),这个方法是设置建立连接的主机地址。

Host header作用

那话说回来,为什么使用错误的Host header会出现404的问题呢?Host header究竟是起到什么样的作用呢?

当一个网络请求发出去之后,网址会经过DNS解析为ip地址并建立连接,当连接到服务器后,则会用到 Host header 进行虚拟主机分流。

而虚拟主机(Virtual Host)是一种服务器技术,它允许在同一台物理服务器(同一个IP地址)上运行多个网站。换句话说,你可以用一台服务器托管多个不同域名的网站,而不需要每个网站都分配一个独立的服务器。区分用户到底访问的是哪个网站的方式就是使用 Host header 进行分流。

总体来说,一个请求的流程是:域名 → DNS 解析 → IP 地址 → 建立 TCP/SSL 连接 → 发送 HTTP 请求头 (Host) → 虚拟主机分流。

这里举一个Nginx配置规则进行分流的例子:

server {
    listen 80;
    server_name www.example.com;
    root /var/www/example;
}

server {
    listen 80;
    server_name www.test.com;
    root /var/www/test;
}
  • listen 80; → 表示监听 HTTP 默认端口 80
  • server_name → 表示这个虚拟主机匹配的域名。
  • root → 表示网站的根目录,也就是请求 / 时返回的文件位置。

Nginx 的分流步骤可以总结为:

  1. 根据端口匹配 server 块
    • 这里两个 server 都监听 80,所以都在候选列表中。
  2. 根据 Host 匹配 server_name
    • Nginx 会查找与请求 Host 最匹配的 server 块。
  3. 匹配成功 → 使用该 server 块的 root 和配置处理请求
  4. 没有匹配 → 使用默认 server
    • Nginx 会选择 listen 指令中第一个或 default_server 标记的 server 作为默认返回。
内容概要:本文介绍了一项创新性未发表的研究,即利用多元宇宙优化算法(Multiverse Optimizer, MVO)对分电价下的需求响应综合能源系统调度问题进行建模求解,旨在实现能源系统的经济性、高效性可持续性运行。该研究构建了包含多种能源设备(如光伏、风机、燃气轮机、储能系统等)及可调节负荷的综合能源系统模型,充分考虑了用户侧的需求响应行为在分电价机制下的响应特性,通过MVO算法对系统运行成本、能源利用率、碳排放等多目标进行协同优化,实现了日前调度计划的智能决策。研究还提供了完整的MATLAB代码实现,便于研究人员复现实验、验证算法性能,并为进一步研究提供可靠的仿真基础。; 适合人群:具备一定电力系统、优化算法及MATLAB编程基础的科研人员、研究生以及从事能源互联网、综合能源系统规划运行的技术工程师。; 使用场景及目标:① 学习并掌握多元宇宙优化算法在复杂能源系统调度中的具体应用方法;② 研究分电价机制如何通过需求响应引导用户参电网互动,实现削峰填谷;③ 实现综合能源系统(IES)中冷、热、电、气等多种能源的协同优化调度,以降低运行成本、提高新能源消纳能力和系统可靠性;④ 为相关领域的学术研究提供可复现的代码实例和仿真平台。; 阅读建议:此资源以MATLAB代码为核心载体,深入剖析了算法应用系统建模的全过程。建议读者在学习,不仅应关注代码的实现细节,更要理解其背后的数学模型、优化目标设定和约束条件的物理意义。建议结合文档中的模型描述,逐步调试代码,观察不同参数和场景下的优化结果,从而深刻掌握综合能源系统优化调度的设计思想关键技术。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值