哪个更可靠gethostbyaddr($ _ SERVER ['REMOTE_ADDR'])或$ _SERVER ['REMOTE_HOST']

时间:2013-05-31 09:20:14

标签: php

我必须从server script获取远程网址主机名,以下哪一项更可靠:

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

2 个答案:

答案 0 :(得分:9)

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

$_SERVER['REMOTE_ADDR']
在所有情况下,

都包含远程主机的IP地址,其中

$_SERVER['REMOTE_HOST']
如果启用了DNS解析,则

将包含DNS主机名(如果HostnameLookups Apache指令设置为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()

答案 1 :(得分:7)

仅当$_SERVER['REMOTE_HOST'] Apache指令设置为HostnameLookups时才会设置

On

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

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

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