AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • 主页
  • 系统&网络
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • 主页
  • 系统&网络
    • 最新
    • 热门
    • 标签
  • Ubuntu
    • 最新
    • 热门
    • 标签
  • Unix
    • 最新
    • 标签
  • DBA
    • 最新
    • 标签
  • Computer
    • 最新
    • 标签
  • Coding
    • 最新
    • 标签
主页 / server / 问题 / 986761
Accepted
TRiG
TRiG
Asked: 2019-10-05 02:31:27 +0800 CST2019-10-05 02:31:27 +0800 CST 2019-10-05 02:31:27 +0800 CST

为什么 $_SERVER['HTTP_HOST'] 有时是 example.com 有时是 example.com:443?

  • 772

这是一个在 Apache 上运行 PHP 7 的 Ubuntu 服务器,其网站强制执行 TLS(使用标准端口)。据我了解,https://example.com并且https://example.com:443完全等效(实际上,在我的浏览器中,当我输入端口号时,端口号会从地址栏中消失)。然而,HTTP_HOST 通常只包含域名,但有时还包含端口号。这可能适用于机器人访问者(我没有分析日志),但即便如此我也不知道如何。有什么实际区别吗?

(这会导致一些问题,因为我们的一些日志和工作队列以及服务器端缓存是用 分隔的HTTP_HOST,所以在不同的主机上拥有相同的站点报告会令人困惑。)

php
  • 1 1 个回答
  • 5871 Views

1 个回答

  • Voted
  1. Best Answer
    Michael Hampton
    2019-10-05T07:06:41+08:002019-10-05T07:06:41+08:00

    PHP$_SERVER['HTTP_HOST']文档指出:

    主机内容:当前请求的标头(如果有)。

    事实上,在这个关联数组中,其键以字符串开头的每个变量都是HTTP_用户代理发送的相应 HTTP 请求变量的副本。

    那么,为什么它有时包含主机名,有时又包含主机名和端口号呢?

    事实证明,这两种语法都是合法且等效的。如果服务器使用非默认端口,则端口号是必需的,否则是可选的。

    在什么情况下,即使是默认端口号,用户代理也会发送端口号?

    RFC 7230 第 5.4 节解释说 Host: 标头的值是 URI 权限组件的精确副本。

    如果目标 URI 包含授权组件,则客户端必须为 Host 发送与该授权组件相同的字段值,不包括任何 userinfo 子组件及其“@”分隔符。. .

    什么是权限组件?

    这来自RFC 3986 第 3.2 节中对 URI 的定义,其中解释了它是用户信息(用户名和密码)、主机和端口。它解释了如果端口是默认端口,则应该省略该端口,但应该不等于必须。(参见RFC 2119。)

    因此,总而言之,如果端口号也出现在 URI 中,用户代理应该在 Host: 标头中发送端口号。因此,如果用户代理有 URL https://example.com:443/robots.txt,那么它将有一个 header Host: example.com:443。用户代理是如何获得这样一个 URL 的,没有真正的方法可以说明。它可能是由您的应用程序发送的,也可能是由用户代理构建的。

    RFC 7230 第 2.7.3 节解释了 URL 规范化,在这种情况下,它表示不包含端口号的 URL 和包含默认端口号的 URL 是等效的。


    TL;DR:您的应用程序必须期望端口号可能出现在此标头中,并以适合使用它的上下文的某种方式处理它。

    您可以考虑改用$_SERVER['SERVER_NAME'],它包含处理请求ServerName的 Apache 中指令的值<VirtualHost>(或者,对于 nginx,块server_name中的第一个server)。

    • 5

相关问题

  • 用户特定的 Php.ini 当 php 作为模块运行时?

  • 使 php mail() 函数在 ubuntu-server 上工作的步骤是什么?

  • Web 服务器和数据库服务器位于完全不同的位置

  • PHP 作为 CGI 还是 Apache 模块?

  • 通过 VPN 连接什么是远程服务器 IP?

Sidebar

Stats

  • 问题 205573
  • 回答 270741
  • 最佳答案 135370
  • 用户 68524
  • 热门
  • 回答
  • Marko Smith

    新安装后 postgres 的默认超级用户用户名/密码是什么?

    • 5 个回答
  • Marko Smith

    SFTP 使用什么端口?

    • 6 个回答
  • Marko Smith

    命令行列出 Windows Active Directory 组中的用户?

    • 9 个回答
  • Marko Smith

    什么是 Pem 文件,它与其他 OpenSSL 生成的密钥文件格式有何不同?

    • 3 个回答
  • Marko Smith

    如何确定bash变量是否为空?

    • 15 个回答
  • Martin Hope
    Tom Feiner 如何按大小对 du -h 输出进行排序 2009-02-26 05:42:42 +0800 CST
  • Martin Hope
    Noah Goodrich 什么是 Pem 文件,它与其他 OpenSSL 生成的密钥文件格式有何不同? 2009-05-19 18:24:42 +0800 CST
  • Martin Hope
    Brent 如何确定bash变量是否为空? 2009-05-13 09:54:48 +0800 CST
  • Martin Hope
    cletus 您如何找到在 Windows 中打开文件的进程? 2009-05-01 16:47:16 +0800 CST

热门标签

linux nginx windows networking ubuntu domain-name-system amazon-web-services active-directory apache-2.4 ssh

Explore

  • 主页
  • 问题
    • 最新
    • 热门
  • 标签
  • 帮助

Footer

AskOverflow.Dev

关于我们

  • 关于我们
  • 联系我们

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve