如何在PHP中获取真正的主机或服务器名称

min*_*nur 4 php

如何在PHP中不使用$ _SERVER ['SERVER_NAME']来获取真正的主机名?还有其他更可靠的方法吗?

我创建了一个从域的路径获取主机名的函数.

我想避免使用$ _SERVER ['SERVER_NAME']变量,因为它可以通过在HTTP请求中发送修改的标头来伪造.

这是我当前的实现(如果路径中包含实际的域名,则此方法有效.例如:/vhosts/website.com/public_html):

function getServerName() {
 $path = realpath(__FILE__);
 $url = array();
 preg_match_all("/\/[a-z0-9-]+(\.[a-z0-9-]+)+/i", $path, $url);
 // 4 is minimum requirement for the address (e.g: http://www.in.tv)
 if (strlen($url[0][0]) > 4) {
  $result = str_replace("/", "", $url[0][0]);
  return $result;
 }
 else
  return false;
}
Run Code Online (Sandbox Code Playgroud)

谢谢!

Pek*_*ica 6

如果您想要客户端无法设置的服务器名称,请使用$_SERVER['SERVER_NAME'].它由服务器本身设置,但也可以在某些情况下使用bug 伪造,就像Gumbo指出并链接到评论中一样.


Tyl*_*ter 5

我认为你所指的是

$_SERVER['HTTP_HOST'];
Run Code Online (Sandbox Code Playgroud)

给定 HTTP 前缀意味着它来自 HTTP 标头。

您可能想使用:

$_SERVER['SERVER_NAME']
Run Code Online (Sandbox Code Playgroud)

这是由服务器定义的并且不能通过请求更改?