【问题标题】:When could the HTTP Host header be undefined?什么时候可以未定义 HTTP Host 标头?
【发布时间】:2011-08-25 15:32:08
【问题描述】:

根据定义 HTTP/1.1 的RFC 2616Host: 标头是强制性的。

客户端必须在所有 HTTP/1.1 请求消息中包含 Host 标头字段。

但是PHP manual 暗示它可能是空的:

'HTTP_HOST':Host 的内容:当前请求的标头,如果有的话。

在哪些情况下,此标头以及 $_SERVER['HTTP_HOST'] 可能为空?我的应用程序能否依赖于它的存在?

【问题讨论】:

  • 根据HTTPbisHost: 标头仍然是“强制性的”,但这并不意味着它会一直存在。 Apache 优雅地处理它的缺失(尽管它不会到达任何配置的虚拟主机)。
  • @mario: 是否有实际的 HTTP/1.1 客户端不发送 Host: 标头?
  • 我不会认为他们是真正的客户,当然当代的浏览器和库都不会。但是任何手工制作的 PHP 脚本都可以。但是,这主要是一个配置问题,与 Apache 虚拟主机无关。 HTTP_HOST 由 Apache 预先筛选,我不会担心它在实践中是空的。不太可能的边缘情况。

标签: php http http-headers


【解决方案1】:

在 HTTP 1.0 中可以为空。如果没有指定主机头,虚拟主机将根本不起作用,因此将使用 Web 服务器中的默认虚拟主机。

我自己测试过这个;在 Nginx 下的 PHP 中,$_SERVER['HTTP_HOST'] 变量被设置为虚拟主机的名称,在我的例子中是 _。但这也取决于你在 Nginx 中的 fastcgi_params 配置。

在共享主机上这并不重要,因为默认虚拟主机将设置为托管公司的某些信息页面,因此您的脚本将不会运行。不过,对于您自己的服务器来说,记住这一点可能是件好事。

【讨论】:

  • “HTTP_HOST”是什么意思? $http_host?
  • 从四年前挖掘答案的工作做得很好! :-) 我根本不记得这个问题,但由于我使用 PHP 做了很多工作,我想我的意思是 $_SERVER['HTTP_HOST'] PHP 变量,它可能作为 Nginx fastcgi_param 发送。我没有那个配置文件了,但是阅读this SO answer我很确定它可能是$host Nginx 变量。
  • 感谢您的回答!然后,为了说清楚,因为答案有点混乱:nginx没有将$http_host设置为虚拟主机的名称,而是将原始HTTP头字段“Host”复制到其中。如果这是空的,$http_host 也是。
  • 原来的问题只是关于 PHP,甚至没有提到 Nginx。
  • 对不起!我是通过 Google 搜索来到这里的,但错过了上下文。
【解决方案2】:

与您的 API 交互的爬虫(例如 google)、爬虫甚至完全合法的脚本可能会意外或无知地跳过 Host 标头。

我添加了这个答案,因为当我寻找同样的东西时,这个问题出现在谷歌上。

【讨论】:

    猜你喜欢
    • 2013-01-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-02-24
    • 2018-03-06
    • 1970-01-01
    • 2019-03-03
    相关资源
    最近更新 更多