我的公司使用一块基于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')?
编辑:增加了赏金,因为我对收到这个问题的答案非常感兴趣。
答案 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']
为您提供了当前请求的域名,并且与请求更直接相关。
下面是一个清楚了解这两件事的例子。假设您在服务器中定义了一个ServerName
为domain.com
且IP address
为198.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地址。 在这种情况下,服务器将使用请求的主机的内容 标头字段,用于选择正确的虚拟主机。