4

我必须从 获取远程 url 主机名server script,以下哪个更可靠:

gethostbyaddr($_SERVER['REMOTE_ADDR'])或者$_SERVER['REMOTE_HOST']

4

2 回答 2

10

这与可靠性无关。尽管在某些情况下它们可能包含相同的值,但这两个变量并不相同。让我解释:

$_SERVER['REMOTE_ADDR']

在所有情况下都将包含远程主机的 IP 地址,其中

$_SERVER['REMOTE_HOST']

如果启用了 DNS 解析,将包含 DNS 主机名(如果HostnameLookupsApache 指令设置为On,感谢@Pekka)。如果它被禁用,那么$_SERVER['REMOTE_HOST']将包含 IP 地址,这就是您可能观察到的。

您的代码应如下所示:

$host = $_SERVER['REMOTE_HOST'];
// if both are the same, HostnameLookups seems to be disabled.
if($host === $_SERVER['REMOTE_ADDR']) {
    // get the host name per dns call
    $host = gethostbyaddr($_SERVER['REMOTE_ADDR'])
}

注意:如果您可以控制 apache 指令,我建议您出于性能原因将其关闭并获取主机名 - 仅在需要时 - 使用gethostbyaddr()

于 2013-05-31T09:26:54.090 回答
7

$_SERVER['REMOTE_HOST']仅当HostnameLookupsApache 指令设置为On.

您可以先检查$_SERVER['REMOTE_HOST'],如果未设置,请进行主机名查找。

两者可能同样可靠,因为它们将在内部使用相同的查找机制。有关此信息的一般可靠性,请参阅PHP 的 $_SERVER['REMOTE_ADDR'] 的可靠性

请注意,主机名查找可能非常缓慢。除非你有充分的理由,否则不要这样做。

于 2013-05-31T09:24:40.743 回答