【问题标题】:Undefined index HTTP_HOST even though it is checked未定义的索引 HTTP_HOST 即使已检查
【发布时间】:2012-09-03 01:05:53
【问题描述】:

代码如下:

if (isset($_SERVER['HTTP_HOST']) === TRUE) {
  $host = $_SERVER['HTTP_HOST'];
}

如何在 if 语句内的行上获得“未定义索引 HTTP_HOST”?我的意思是,在使用索引设置之前会对其进行检查。

为什么有时不能设置 HTTP_HOST?

【问题讨论】:

  • 您的代码中不可能有未定义的索引。如果你在命令行中运行 php,HTTP_HOST 是没有设置的,因为这个 HTTP_HOST 是由 web 服务器设置的。
  • 如果有人告诉您您的代码有问题,我会感到非常惊讶。您是否 100% 确定错误出现在该行?
  • 我 100% 确定错误在于 $host = $_SERVER['HTTP_HOST'];线,我很困惑。我还认为未定义的索引通知是不可能的。这就是我在这里问这个问题的原因。
  • 使用 getenv('HTTP_HOST') 代替 $_SERVER['HTTP_HOST']。
  • 我有这方面的经验,使用的是 nginx,而不是 apache Web 服务器。

标签: php apache


【解决方案1】:

你在使用 PHP-CLI 吗?

HTTP_HOST 仅适用于浏览器。

【讨论】:

  • 那么如何在命令行中关闭它呢?这是一个通知。我的php.ini 中的错误只有 E_ERROR。
【解决方案2】:

一个糟糕的浏览器可以省略发送 que 主机头信息,试试这个例子:

telnet myphpserver.com 80
> GET / <enter><enter>

在这种情况下 $_SERVER['HTTP_HOST'] 没有赋值,在这种情况下你可以使用 $_SERVER['SERVER_NAME'] 但前提是 $_SERVER['HTTP_HOST'] 为空,因为 no 是相同的。

【讨论】:

  • 谢谢,telnet 检查是针对空$_SERVER['HTTP_HOST'] 测试我的应用程序的完美解决方案。我曾尝试使用 -H 卷曲。
【解决方案3】:

如果您在浏览器上运行,则必须始终设置 HTTP_HOST...然后无需检查...简单,

$host = $_SERVER['HTTP_HOST'];

够了

【讨论】:

  • 蹩脚的浏览器(或机器人)可能会忘记发送 HOST 标头;在这种情况下不会设置 HTTP_HOST 变量。
  • 您有一个错字 - 分号前的括号。我不建议不要检查。
【解决方案4】:

我通常会省略 === TRUE,因为这里不需要它,因为 isset() 返回一个布尔值,但这不应阻止您的代码工作。

我还将 $host 设置为合理的默认值(取决于您的应用程序) if 语句之前。如果以后要引用它,我有一个一般规则,即不要在条件中引入新变量。

$host = FALSE;    // or $host = ''; etc. depending on how you'll use it later.
if (isset($_SERVER['HTTP_HOST'])) {
  $host = $_SERVER['HTTP_HOST'];
}

【讨论】:

  • 最佳实践是使用严格的类型检查,所以我这样做 === TRUE。并且主机变量设置为空字符串,是的。我使用错误处理程序,有时会出现此错误。问题不在于代码的工作/不工作状态,而更多是关于它为什么会发生以及如何发生的哲学思考。
  • @donkapone “最佳实践是使用严格的类型检查,所以我这样做 === TRUE”。我在任何地方都没有看到这种做法。它不会改变代码的行为、性能,只会让它变得更冗长,需要更多的努力去理解。我会把这个问题带到 softwareengineering.stackexchange.com 或者只是查看一些受人尊敬的开源项目,看看它是不是很不寻常。
  • 这不回答OP
【解决方案5】:

使用空主机完成请求时:

GET / HTTP/1.1
Host:

那么 isset($_SERVER['HTTP_HOST']) 为真!

最好用空如:

$host = '';
if (!empty($_SERVER['HTTP_HOST'])) {
  $host = $_SERVER['HTTP_HOST'];
}

详细信息请看这里https://shiflett.org/blog/2006/server-name-versus-http-host

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2022-01-25
    • 2015-03-31
    • 2018-07-07
    • 1970-01-01
    • 2013-07-19
    • 1970-01-01
    • 1970-01-01
    • 2017-10-09
    相关资源
    最近更新 更多