24

Here's the code:

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

How is it possible to get an "Undefined index HTTP_HOST" on the line inside the if statement? I mean, the index setting is checked before it is used.

And why could the HTTP_HOST sometimes be not set?

4

5 回答 5

32

你在使用 PHP-CLI 吗?

HTTP_HOST 仅适用于浏览器。

于 2012-09-10T07:38:55.303 回答
4

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

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

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

于 2019-04-17T01:25:54.990 回答
2

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

$host = $_SERVER['HTTP_HOST'];

足够的

于 2012-09-10T07:33:15.810 回答
2

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

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

$host = FALSE;    // or $host = ''; etc. depending on how you'll use it later.
if (isset($_SERVER['HTTP_HOST'])) {
  $host = $_SERVER['HTTP_HOST'];
}
于 2012-09-10T07:45:47.393 回答
0

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

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

于 2020-08-15T19:09:12.433 回答