未定义的索引HTTP_HOST(即使已选中)


Undefined index HTTP_HOST even though it is checked

以下是代码:

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

如何在if语句内的行上获得"未定义索引HTTP_HOST"?我的意思是,索引设置在使用之前已经过检查。

为什么HTTP_HOST有时不能设置?

您正在使用PHP-CLI吗?

HTTP_HOST仅适用于浏览器。

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

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

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

如果在浏览器上运行,则必须始终设置HTTP_HOST。。。那么就没有必要检查。。。简单地说,

$host = $_SERVER['HTTP_HOST'];

是否足够

我通常会省略=== 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'];
}

当使用空主机完成请求时:

GET / HTTP/1.1
Host:

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

最好使用空像:

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

有关详细信息,请查看此处https://shiflett.org/blog/2006/server-name-versus-http-host