假设其中一个设置简单(CentOS 7,Apache 2.4.x和PHP 5.6.20)并且只有一个网站(不假定虚拟主机)...
在PHP的意义上,PHP $_SERVER['SERVER_NAME']是$_SERVER基于httpd.conf中的Apache配置(**ServerName**带有指令UseCanonicalName On)在超全局变量中注册的元素(可以从包含的虚拟主机配置文件中获取,等等)。HTTP_HOST派生自HTTP host标头。将此视为用户输入。使用前进行过滤和验证。
这是一个我$_SERVER['SERVER_NAME']用作比较基础的示例。以下方法来自我命名为的具体子类ServerValidator(的子Validator)。ServerValidator在使用前检查$ _SERVER中的六个或七个元素。
在确定HTTP请求是否为POST时,我使用此方法。
public function isPOST()
{
    return (($this->requestMethod === 'POST')    &&  // Ignore
            $this->hasTokenTimeLeft()            &&  // Ignore
            $this->hasSameGETandPOSTIdentities() &&  // Ingore
            ($this->httpHost === filter_input(INPUT_SERVER, 'SERVER_NAME')));
}
在调用此方法时,将已经对所有相关的$ _SERVER元素进行了过滤和验证(并设置了相关的属性)。
线...
($this->httpHost === filter_input(INPUT_SERVER, 'SERVER_NAME')
...检查$_SERVER['HTTP_HOST']值(最终从请求的hostHTTP标头派生)是否匹配$_SERVER['SERVER_NAME']。
现在,我使用超全局发言,解释我的例子,但这只是因为有些人不熟悉INPUT_GET,INPUT_POST以及INPUT_SERVER在问候filter_input_array()。
最重要的是,除非满足所有四个条件,否则我不会在服务器上处理POST请求。因此,就POST请求而言,未能提供HTTP host标头(已测试过该功能)对于严格的HTTP 1.0浏览器来说是注定的。此外,该请求的主机必须与价值相匹配的在httpd.conf中通过extention的值,并且,在超全局。同样,我将使用PHP过滤器功能,但是您会发现我的漂移。ServerName$_SERVER('SERVER_NAME')$_SERVERINPUT_SERVER
请记住,Apache经常ServerName在标准重定向中使用(例如,在URL末尾添加斜杠:例如,http : //www.foo.com变成http://www.foo.com/),即使您不是使用URL重写。
我使用$_SERVER['SERVER_NAME']的不是标准$_SERVER['HTTP_HOST']。在这个问题上有很多来回的话题。  $_SERVER['HTTP_HOST']可以为空,因此这不应成为创建代码约定(例如上面的我的公共方法)的基础。但是,仅仅因为两者都可以设置并不能保证它们相等。测试是确定的最佳方法(请记住Apache版本和PHP版本)。