【问题标题】:$_SERVER['SERVER_NAME'] returns someone-else-domain.com$_SERVER['SERVER_NAME'] 返回someone-else-domain.com
【发布时间】:2014-12-20 19:00:00
【问题描述】:

问题: php 脚本在$_SERVER['SERVER_NAME'] 中返回someone-else-domain.com,但它应该返回foo.example.com。我没有配置该虚拟主机,也不是我的 dyndns/域。不知道怎么找原因。


当前状态:

我的 php 脚本在每个请求中保存 $_SERVER['SERVER_NAME'] 的值。我使用 SERVER_NAME 而不是 HTTP_HOST 因为,如果我正确理解 PHP 手册,这正是我所需要的:

SERVER_NAME: “当前脚本在其下执行的服务器主机的名称。如果脚本在虚拟主机上运行,​​这将是为该虚拟主机定义的值。”

apache2 服务器位于 debian7 机器上。我使用来自 freedns.afraid.org 的动态 dns 服务指向服务器 ip。下面, foo.example.com 当然不是我真正的服务器动态。我有 3 个 dyndns 指向我的服务器 IP:foo-、bar- 和 baz.example.com。下面是 foo 的配置。 bar 和 baz 完全一样,当然除了域和路径。

SERVER_NAME 被保存的部分。我认为这没有错:

$this->v['host'] = NULL;
if (isset($_SERVER['SERVER_NAME'])) { 
    $this->v['host'] = str_replace('www.', '', $_SERVER['SERVER_NAME']);
}

/etc/apache2/sites-enabled/foo.example.com

<VirtualHost *:80>
    ServerAdmin webmaster@foo.example.com
    ServerName foo.example.com
    ServerAlias foo # to access from local network, less typing, more time to be lazy
    ServerSignature Off

    DocumentRoot /var/www/foo.example.com/public

    <Directory />
            Options -Indexes +FollowSymLinks
            AllowOverride none
    </Directory>

    <Directory /var/www/foo.example.com/public>
            Options -Indexes +FollowSymLinks +MultiViews
            AllowOverride Options=Indexes
            Order allow,deny
            allow from all
    </Directory>

    ErrorLog ${APACHE_LOG_DIR}/error.log
    LogLevel warn
    CustomLog ${APACHE_LOG_DIR}/access.log combined
</VirtualHost>

/etc/apache2/ports.conf

NameVirtualHost *:80
Listen 80

猫访问.log | grep someone-else-domain.com

1.2.3.4 - - [14/Dec/2014:20:11:41 +0100] "GET http://www.someone-else-domain.com/ HTTP/1.1" 200 1488 "-" "Mozilla/5.0 (Windows NT 6.1; WOW64; rv:29.0) Gecko/20100101 Firefox/29.0"
1.2.3.5 - - [16/Dec/2014:00:16:14 +0100] "GET http://www.someone-else-domain.com/ HTTP/1.1" 200 1488 "-" "Mozilla/5.0 (Windows NT 6.1; WOW64; rv:29.0) Gecko/20100101 Firefox/29.0"
1.2.3.6 - - [18/Dec/2014:01:48:19 +0100] "GET http://www.someone-else-domain.com/ HTTP/1.1" 200 2033 "-" "Mozilla/5.0 (Windows NT 6.1; WOW64; rv:29.0) Gecko/20100101 Firefox/29.0"
1.2.3.7 - - [18/Dec/2014:12:18:05 +0100] "GET http://www.someone-else-domain.com/ HTTP/1.1" 200 2153 "-" "Mozilla/5.0 (Windows NT 6.1; WOW64; rv:29.0) Gecko/20100101 Firefox/29.0"
1.2.3.8 - - [20/Dec/2014:00:24:23 +0100] "GET http://www.someone-else-domain.com/ HTTP/1.1" 200 2398 "-" "Mozilla/5.0 (Windows NT 6.1; WOW64; rv:29.0) Gecko/20100101 Firefox/29.0"

有人知道是什么原因造成的吗?我可以通过在我的脚本中添加主机白名单或拆分 PHP_SELF 来解决这个问题。但首先我想知道我是否应该担心;)

【问题讨论】:

    标签: php apache dns virtualhost


    【解决方案1】:

    在写作和研究时,我发现我可以解决这个问题。因为我已经写了这么多,所以我还是发布了这个问题,希望其他人发现它有帮助。

    Apache2 指令UseCanonicalName On|Off|DNS

    配置服务器如何确定自己的名称和端口。

    http://httpd.apache.org/docs/2.2/mod/core.html#usecanonicalname

    所以,如果我正确理解了手册,将UseCanonicalName On 添加到虚拟主机配置中,一切都应该按预期工作。

    另见此 SO 答案:https://stackoverflow.com/a/2297421/668598

    【讨论】:

      猜你喜欢
      • 2023-04-04
      • 2018-04-17
      • 1970-01-01
      • 1970-01-01
      • 2011-07-16
      • 1970-01-01
      • 2012-07-08
      • 1970-01-01
      • 2013-10-19
      相关资源
      最近更新 更多