vhost中的ServerName没有在php $ _SERVER变量中设置?

时间:2014-06-18 12:51:57

标签: php apache

ServerName在虚拟主机中设置,但是当我引用$_SERVER['SERVER_NAME']时,我得到了请求标头中设置的内容。

我正在玩欺骗它,无论我将Host请求标头设置为服务器变量中填充的内容。

我认为它应该采用vhost中的任何内容,而另一个变量如$_SERVER['HTTP_HOST']应该具有请求标头值。

如果vhost工作不正常而不仅仅使用请求标头,我希望设置一些虚拟值。

我应该研究一下apache配置设置吗?什么可能导致在服务器上发生这种情况?

我想依赖$_SERVER['SERVER_NAME']的原因是为了安全性和可靠性,因此用户无法欺骗它,所以我们是那些设置它并在脚本编写过程中关闭它的人。

感谢。

2 个答案:

答案 0 :(得分:1)

通过别名访问网站时未设置SERVER_NAME。

参见解释(和答案):https://stackoverflow.com/a/4834148/911718

答案 1 :(得分:0)

  

是否有任何我应该研究的apache配置设置

我在comment中发现了一个有趣的PHP documentation,这意味着拥有实际的apache ServerName值是为了确保UseCanonicalName apache目录已打开。

  

在带有ServerAlias指令的apache虚拟主机设置中使用$ _SERVER ['SERVER_NAME']变量时,请务必检查UseCanonicalName apache指令。如果为On,则此变量将始终具有apache ServerName值。如果它是Off,它将具有浏览器发送的标题给出的值。

我不确定这是否是您正在寻找的,但可能值得一试。

修改

(可能)与问题更相关:我发现someone遇到了与您类似的问题:

  

我在函数[...]中使用变量$ _SERVER ['SERVER_NAME']但我们可以在调用函数check_servname()之前修改$ _SERVER ['SERVER_NAME']的值。我正在寻找一个正确的服务器名称,而不是在调用check_servername之前可能已更改的服务器名称:

一个解决方案是在启动时定义一个超级全局变量(是的......讨厌但......),这些变量无法修改,因此通过引用超全局变量,您可以确保获得正确的值。

所以使用像

这样的东西
define ( 'SERVER_NAME' , $_SERVER['SERVER_NAME'] );
一开始就应该通过引用SERVER_NAME而不是$_SERVER['SERVER_NAME']来解决您的问题。试一试。