这是边缘编程,但我先在这里张贴。
PHPinfo的输出
apache2handler Apache Version Apache/2.2.3 (CentOS) Apache API Version 20051115 Server Administrator root@localhost Hostname:Port localdomain.com:0 User/Group apacheuser(500)/500
我试图find一种方法来检索PHP中的“Hostname:port”字段。
我们有apache把我们所有的虚拟主机信息转储到一个文件中,然后把这个单个文件分解成几个文件和相关信息(总点击等)被logging到数据库中。 我们目前遇到的一个问题是,如果一个域名在ServerAlias中出现,我们的php软件将无法find包含他们日志的数据库表(因为这个域在技术上是不正确的)。但是,主机名:端口“字段在php / phpinfo(); 总是回顾我想要的信息,这是主要的域名。
如果有任何其他方法PHP可以从Apache获得“ServerName”字段我不知道请让我知道,因为这将是很容易。
另一种方法是在每个虚拟主机中都有一个SetEnv命令,但不必经过并添加一个
SetEnv primarydomain localdomain.com
到每个VirtualHost,有没有办法使用一个variables?
在例子中:
SetEnv primarydomain %v
谢谢!!
———————更新—————————
我们用正则expression式search和replace解决了这个问题。
search:^ ServerName \ s \ b((?= [a-z0-9 – ] {1,63}。)[a-z0-9] +( – [a-z0-9] +)*。)+ ([AZ] {2,63})\ b
replace:$&nSetEnv \ tprimarydomain \ t $ 1 $ 3
如果标准的$ _SERVER ['SERVER_NAME']不是你在之后,你尝试过$ _SERVER ['SERVER_SIGNATURE']吗?
您是否在虚拟主机中设置了ServerAdmin指令?
如果是这样,我会使用$_SERVER['SERVER_ADMIN'] ,并采取@符号后的电子邮件地址的后半部分。
例:
array_pop(split("@", $_SERVER['SERVER_ADMIN'], 2))'
问题用正则expression式解决。
search:^ ServerName \ s \ b((?= [a-z0-9 – ] {1,63}。)[a-z0-9] +( – [a-z0-9] +)*。)+ ([AZ] {2,63})\ b
replace:$&nSetEnv \ tprimarydomain \ t $ 1 $ 3
如果您对客户端提供的主机名不感兴趣,那么您可能希望使用这些指令:
UseCanonicalName和UseCanonicalPhysicalPort 。
对于真实的服务器名称(来自操作系统,而不是虚拟服务器):
echo php_uname('n');
对于港口:
echo $_SERVER["SERVER_PORT"];