假设其中一个设置简单(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']
值(最终从请求的host
HTTP标头派生)是否匹配$_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')
$_SERVER
INPUT_SERVER
请记住,Apache经常ServerName
在标准重定向中使用(例如,在URL末尾添加斜杠:例如,http : //www.foo.com变成http://www.foo.com/),即使您不是使用URL重写。
我使用$_SERVER['SERVER_NAME']
的不是标准$_SERVER['HTTP_HOST']
。在这个问题上有很多来回的话题。 $_SERVER['HTTP_HOST']
可以为空,因此这不应成为创建代码约定(例如上面的我的公共方法)的基础。但是,仅仅因为两者都可以设置并不能保证它们相等。测试是确定的最佳方法(请记住Apache版本和PHP版本)。