我必须从server
script
获取远程网址主机名,以下哪一项更可靠:
gethostbyaddr($_SERVER['REMOTE_ADDR'])
或$_SERVER['REMOTE_HOST']
答案 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']
请注意,主机名查找可能非常慢。除非你有充分的理由,否则不要这样做。