PHP $ _SERVER ['SERVER_NAME']在IIS6中返回计算机名称

时间:2011-02-16 18:20:43

标签: php iis iis-7 iis-6

我的公司使用一块基于PHP的软件,它依赖于$_SERVER['SERVER_NAME']来构建一个URL。它在Windows Server 2003或2008下使用IIS6或IIS7通过FastCGI在PHP 5.2上运行。

这在我们安装它的每个IIS系统上“正确”(或者至少,我们期望它如何工作)。换句话说,在同一台服务器上,如果您使用http://app.foo.com/myscript.php调用它,$_SERVER['SERVER_NAME']为'app.foo.com',如果您使用http://192.168.1.22/myscript.php调用$_SERVER['SERVER_NAME']$_SERVER['SERVER_NAME']是'192.168.1.22',等等。

今天,我们第一次将它安装在服务器(带有IIS6的Windows Server 2003)上,其运行方式不同。无论我们用什么URL加载脚本,$ _SERVER ['SERVER_NAME']都是'myserver'(服务器的机器名称),这会导致问题。

既然已经出现了这个问题,我们正在努力在将来的软件版本中消除$_SERVER['SERVER_NAME']的使用......但是我可以执行任何配置(在IIS6,php.ini中, ...?)在此服务器上解决此问题?如果我们无法更改它以使$_SERVER['SERVER_NAME']始终包含来自请求URL的主机,那么至少有一些方法可以配置它,以便{{1}}将包含特定的所需FQDN('app.foo .com'而不是'myserver')?

编辑:增加了赏金,因为我对收到这个问题的答案非常感兴趣。

4 个答案:

答案 0 :(得分:2)

  

但是我可以在此服务器上执行任何配置(在IIS6,php.ini,...?中)以解决此问题吗?

$ _SERVER这样的全局变量实际上是可写的,所以作为短期解决方案只是为了让事情正常工作,你可以插入一些快速的PHP代码来专门将SERVER_NAME键设置为站点工作所需的值。 / p>

例如,在您打开的PHP文件中,您可以只包含以下行:

$_SERVER['SERVER_NAME'] = 'app.foo.com';

对$ _SERVER ['SERVER_NAME']的所有后续调用都将具有您想要的值。

如果您需要考虑IP访问权限,可以使用REQUEST_URI,parse_url()或HTTP_HOST(如果可用)的组合。

长期,从代码库中删除SERVER_NAME可能有助于降低血压:)

答案 1 :(得分:0)

尝试使用$_SERVER['HTTP_HOST']或如果不起作用,请使用$_SERVER['SCRIPT_URI']parse_url()

答案 2 :(得分:0)

就我所知,$_SERVER['SERVER_NAME']给出了服务器配置文件中定义的值,并没有告诉您有关请求的任何信息。鉴于$_SERVER['HTTP_HOST']为您提供了当前请求的域名,并且与请求更直接相关。

下面是一个清楚了解这两件事的例子。假设您在服务器中定义了一个ServerNamedomain.comIP address198.16.120.100的主机。

以下是这两个变量之间的差异:

for http://www.domain.com

$_SERVER['SERVER_NAME'] = domain.com
$_SERVER['HTTP_HOST'] = www.domain.com

for http://198.16.120.100

$_SERVER['SERVER_NAME'] = domain.com
$_SERVER['HTTP_HOST'] = 198.16.120.100

如果您要更改IIS服务器的SERVER_NAME,我猜这link会对您有所帮助。

如果您还需要更多,请不要犹豫。

此致

答案 3 :(得分:0)

请尝试在IIS 6.0中设置主机标头并对其进行测试Reference

注意: $_SERVER是一个包含标题,路径和脚本位置等信息的数组。此阵列中的条目由Web服务器创建。无法保证每个Web服务器都能提供这些服务;服务器可以省略一些,或提供此处未列出的其他服务器。也就是说,CGI/1.1 specification中考虑了大量这些变量,因此您应该能够期待这些变量。

SERVER_NAME变量必须设置为服务器主机的名称    客户端请求所针对的。这是一个不区分大小写的    主机名或网络地址。它构成了主持人的一部分    脚本-URI。

  SERVER_NAME = server-name
  server-name = hostname | ipv4-address | ( "[" ipv6-address "]" )

部署的服务器可以有多个可能的值    变量,其中多个HTTP虚拟主机共享相同的IP地址。    在这种情况下,服务器将使用请求的主机的内容    标头字段,用于选择正确的虚拟主机。