- android - RelativeLayout 背景可绘制重叠内容
- android - 如何链接 cpufeatures lib 以获取 native android 库?
- java - OnItemClickListener 不起作用,但 OnLongItemClickListener 在自定义 ListView 中起作用
- java - Android 文件转字符串
鉴于在发送 HTTP 请求时已经建立了 TCP 连接,IP 地址和端口是隐式已知的——TCP 连接是 IP + 端口。
那么,为什么我们需要 Host
header ?这是否仅在有多个主机映射到 TCP 连接中隐含的 IP 地址的情况下才需要?
最佳答案
Host
header 告诉网络服务器要使用哪个虚拟主机(如果已设置)。您甚至可以使用多个别名(= 域和通配符域)来拥有相同的虚拟主机。在这种情况下,如果您想根据不同的域提供不同的行为,您仍然可以在 Web 应用程序中手动读取该 header 。这是可能的,因为在您的网络服务器中,您可以(如果我没记错的话,您必须)将 一个 虚拟主机设置为默认主机。只要 host
header 与任何已配置的虚拟主机不匹配,就会使用此默认虚拟主机。
意思是:你没看错,虽然说“多个主机”可能有点误导:主机(被寻址的机器)是一样的,真正解析到 IP 地址的是不同的域名(包括子域),也称为 主机名(但不是主机!)。
尽管这不是问题的一部分,但有一个有趣的事实:此规范在早期导致了 SSL 问题,因为 Web 服务器必须提供与客户端已寻址的域相对应的证书。然而,为了知道使用什么证书,网络服务器应该事先知道寻址的主机名。但是因为客户端仅通过加密 channel 发送该信息(这意味着:在证书已经发送之后),服务器不得不假设您浏览了默认主机。这意味着每个 IP 地址/端口组合一个 SSL 安全域。
Server Name Indication 解决了这个问题;然而,这再次破坏了一些隐私,因为服务器名称现在再次以纯文本传输,因此每个中间人都会看到您尝试连接的主机名。
虽然网络服务器会从服务器名称指示中知道主机名,但 Host
header 并没有过时,因为服务器名称指示信息仅在 TLS 握手中使用。对于不安全的连接,根本没有服务器名称指示,因此 Host
header 仍然有效(并且是必需的)。
另一个有趣的事实:大多数网络服务器(如果不是全部)拒绝您的 HTTP 请求,如果它不完全包含一个 Host
header ,即使它可以被省略,因为只配置了默认的虚拟主机。这意味着 http-(get-) 请求中所需的最少信息是包含 METHOD
RESOURCE
和 PROTOCOL VERSION
的第一行,并且至少Host
header ,如下所示:
GET /someresource.html HTTP/1.1
Host: www.example.com
在MDN Documentation on the "Host" header他们实际上是这样说的:
A Host header field must be sent in all HTTP/1.1 request messages. A400 (Bad Request) status code will be sent to any HTTP/1.1 requestmessage that lacks a Host header field or contains more than one.
正如 Darrel Miller 所提到的,完整的规范可以在 RFC7230 中找到.
关于http - 什么是 HTTP "Host" header ?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43156023/
Windows“主机”文件编码是什么?是UTF-8吗?还是 ASCII + 系统代码页?应如何添加 IDN(带有变音符号等的国际域名)条目以及它们是否可以添加? 最佳答案 它应该是没有 BOM 的 A
我已经在谷歌上搜索了大约 90 分钟,但仍然没有答案。在哪里设置 default_url_options?我已经将其设置为 config.action_mailer.default_url_optio
我正在从它的样式文件中设计一个 Angular 组件,我发现我必须使用 :host ,:host() 或 :host-context selector ,它们各自有什么不同? 最佳答案 :主机 是用于
我正在创建简单的网络应用程序。而且我在服务器配置方面遇到了问题。当我尝试启动服务器时,收到错误消息 The element type "Host"must be terminated by the m
这个有效: 127.0.0.1 www.somesite.com 但不是这个: 127.0.0.1/somepath/www www.mysite.com 我做错了什么?是否可
我必须查看我的前同事留下的一些脚本,我很好奇为什么他在参数中使用 $a = $(Read-Host -Prompt "Write Something")节而不是 $a = (Read-Host -Pr
我在远程连接到 MySQL 服务器时遇到问题。我知道我的用户设置了来自任何主机的“%”通配符,因此我应该有权访问服务器。我可以使用我的凭据本地登录 MySQL 服务器,但不能远程登录。 我在 my.c
我正在尝试使用 angular 2 构建一个双主题应用程序。有问题的组件 css 已经使用 :host/deep/强制对子组件进行样式设置。 但是我正在尝试根据 html 主题切换此样式,并且我正在使
我需要将特定的传出连接(从我系统上的任何 网络客户端)重定向到特定的 IP。是的,可以通过在 /etc/hosts 文件中添加这一行来完成: 123.456.789.012 www.mydomain
尝试在开发中预览我的邮件程序,但出现上述错误。(使用 Michael Hartl 教程)。 我相信它因为我的主机而无法正常工作。但是,使用 cloud 9 我很难找到我的主机。在书中,它被定义为 Cl
nc 当我在虚拟机上执行它时工作正常。 Connection to 10.0.0.10 22 port [tcp/ssh] succeeded! 但是当我在 docker 容器内执行相同的命令时,它会
我正在学习PowerShell,想知道两者之间的区别 Read-Host -Prompt "Text" 和 Read-Host "Text" 是同一件事还是我没有看到的区别? 最佳答案 这是同一件事。
我无法对 Cassandra 节点进行查询。我能够连接到集群并进行连接。然而,在执行查询时,它失败了 Caused by: com.datastax.driver.core.exceptions.No
我有这样的场景,比如我需要运行一个位于 12.34.567 的 API curl 请求,登录后我必须再登录一台主机 98.76.543。 登录到第二个主机后,我必须运行curl -XPOST -H"C
当我尝试 git push -u origin master到我的存储库,我得到 400 Bad Request .我特意用 编辑了一些信息。 最近从 gitlab-ee 中解绑了 nginx,并验
假设我有某个程序的源代码,源代码使用 GNU autotools,为了简单起见,假设该程序绝不是任何类型的开发工具。如果我手边有交叉工具链,我可以使用 --host configure 为平台 foo
在我的 ASP.NET Core 2.0 项目中,我一直在使用 Microsoft.Extensions.Hosting 命名空间中的 IHostingEnvironment 和 IApplicati
我正在使用以 Python3.6 为基础的 docker 镜像。突然间它开始崩溃(启动后立即退出)。所以我冲进了容器,发现它崩溃是因为与容器化 postgres 数据库的连接突然失败。我设法得到的唯一
已关闭。此问题不符合Stack Overflow guidelines 。目前不接受答案。 这个问题似乎不是关于 a specific programming problem, a software
我尝试使用 ssh命令连接到另一个远程主机。 ssh -p 21098 -i $OPENSHIFT_DATA_DIR/.ssh/host_key user@domain.com The authe
我是一名优秀的程序员,十分优秀!