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

我的公司使用一个基于
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’]是’192.168.1.22’等.

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

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

编辑:添加了赏金,因为我非常有兴趣收到这个问题的答案.

最佳答案

but is there any configuration I can perform (in IIS6, php.ini, … ?) on this server to fix this in the meantime?

诸如$_SERVER之类的全局变量实际上是可写的,因此作为一个短期解决方案只是为了使事情正常工作,您可以插入一些快速的PHP代码来专门将SERVER_NAME键设置为站点工作所需的值.

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

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

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

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

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

点赞