Проблема: PHP-скрипт возвращает someone-else-domain.com
в $_SERVER['SERVER_NAME']
, но он должен вернуться foo.example.com
, я не настроил этот vhost и не мой dyndns / домен. не знаю, как найти причину этого.
Текущее состояние:
мой скрипт php сохраняет значение $_SERVER['SERVER_NAME']
на каждый запрос. я использую SERVER_NAME
вместо HTTP_HOST
потому что, если я правильно понял руководство по PHP, это именно то, что мне нужно:
НАЗВАНИЕ СЕРВЕРА:
«Имя хоста сервера, под которым выполняется текущий скрипт. Если скрипт выполняется на виртуальном хосте, это будет значение, определенное для этого виртуального хоста».
сервер apache2 находится на коробке debian7. Я использую динамический DNS-сервис от freedns.afraid.org, чтобы указать IP-адрес сервера. ниже foo.example.com, конечно, не мои настоящие динды для сервера. я получил 3 динда, указывающих на мой 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 [email protected]
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
cat access.log | grep somebody-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. но сначала я хочу знать, стоит ли мне волноваться;)
во время написания и исследования я обнаружил, что могу решить эту проблему. и так как я уже написал так много, я в любом случае отправляю вопрос, надеясь, что кто-то найдет его полезным.
Директива Apache2 UseCanonicalName On | Off | DNS:
настраивает, как сервер определяет свое собственное имя и порт.
http://httpd.apache.org/docs/2.2/mod/core.html#usecanonicalname
так что, если я правильно понял руководство, добавив UseCanonicalName On
к конфигурации виртуального хоста, и все должно работать как положено.
также см. этот так ответ: https://stackoverflow.com/a/2297421/668598
Других решений пока нет …