Назад | Перейти на главную страницу

Один домен на Apache переходит на страницу по умолчанию без www.

Я использую Apache / 2.4.16 на FreeBSD 10.2. У меня работает два экземпляра Apache, каждый из которых обслуживает несколько доменных имен. Сервер имеет два сетевых интерфейса, один для общедоступного Интернета, а другой доступен только через мою внутреннюю локальную сеть. Все файлы конфигурации виртуального хоста почти идентичны, за исключением доменных имен и каталогов. Все сайты работают так, как ожидалось, за исключением одного: если я попытаюсь зайти на Adultemployment.net, я получу страницу сервера по умолчанию, но если я укажу любое из имен компьютеров, настроенных в DNS (www, ftp, mail и т. Д.) .) Я получаю страницу сайта должным образом, например, www.adultemployment.net отображается правильно.

Это файл конфигурации виртуального хоста для vultemployment.net:

<VirtualHost 100.0.193.102:80 192.168.14.202:80>
    ServerName AdultEmployment.net
    ServerAlias *.AdultEmployment.net
    ServerAdmin webmaster@AdultEmployment.net
    DocumentRoot "/path.to/adultemploy/www"
    <Directory "/path.to/adultemploy/www">
        Options All MultiViews
        AllowOverride All
        Require all granted
    </Directory>
    ErrorDocument 404 /cgibin/badurl.pl
    ErrorLog "|/usr/local/sbin/rotatelogs /path.to/adultemploy/logs/error_log 86400"
    CustomLog "|/usr/local/sbin/rotatelogs /path.to/adultemploy/logs/access_log 86400" combined
    <IfModule mod_alias.c>
        ScriptAlias /cgibin/ "/path.to/adultemploy/cgibin/"
        <Directory "/path.to/adultemploy/cgibin">
            AllowOverride None
            Options None
            Require all granted
        </Directory>
    </IfModule>
</VirtualHost>

Это файл конфигурации виртуального хоста для другого сайта (который работает правильно), bidsadult.com:

<VirtualHost 100.0.193.102:80 192.168.14.202:80>
    ServerName BidsAdult.com
    ServerAlias *.BidsAdult.com
    ServerAdmin webmaster@BidsAdult.com
    DocumentRoot "/path.to/bidsadult/www"
    <Directory "/path.to/bidsadult/www">
        Options All MultiViews
        AllowOverride All
        Require all granted
    </Directory>
    ErrorDocument 404 /cgibin/badurl.pl
    ErrorLog "|/usr/local/sbin/rotatelogs /path.to/bidsadult/logs/error_log 86400"
    CustomLog "|/usr/local/sbin/rotatelogs /path.to/bidsadult/logs/access_log 86400" combined
    <IfModule mod_alias.c>
        ScriptAlias /cgibin/ "/path.to/bidsadult/cgibin/"
        <Directory "/path.to/bidsadult/cgibin">
            AllowOverride None
            Options None
            Require all granted
        </Directory>
    </IfModule>
</VirtualHost>

Конфигурации по умолчанию и виртуального хоста устанавливаются в httpd.conf:

# 'Main' server configuration
#
# The directives in this section provide defaults for any
#  <VirtualHost> containers you may define later in the file.
#
# All of these directives may appear inside <VirtualHost> containers,
# in which case these default settings will be overridden for the
# virtual host being defined.
#
ServerAdmin webmaster@occupant591.net
ServerName generic.occupant591
#
<Directory />
    AllowOverride none
    Require all denied
</Directory>
#
<IfModule dir_module>
    DirectoryIndex index.php index.cgi index.shtml index.htm index.html
</IfModule>
#
<Files ".ht*">
    Require all denied
</Files>
#
LogLevel info

<IfModule log_config_module>
    LogFormat "%h %l %u %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-Agent}i\"" combined
    LogFormat "%h %l %u %t \"%r\" %>s %b" common
    LogFormat "%{Referer}i -> %U" referer
    LogFormat "%{User-agent}i" agent
    <IfModule ssl_module>
        LogFormat "%t %h %{SSL_PROTOCOL}x %{SSL_CIPHER}x \"%r\" %b" ssl_request
    </IfModule>
    <IfModule logio_module>
        LogFormat "%h %l %u %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-Agent}i\" %I %O" combinedio
    </IfModule>
</IfModule>

<IfModule cgid_module>
    Scriptsock logs/cgisock
</IfModule>

<IfModule mime_module>
    TypesConfig conf/mime.types
    AddType application/x-httpd-php         .php
    AddType application/x-tar               .tgz
    AddType text/plain                      .xml
    AddType image/x-icon                    .ico
    AddEncoding x-compress .Z
    AddEncoding x-gzip .gz .tgz
    AddType application/x-compress .Z
    AddType application/x-gzip .gz .tgz
    AddHandler cgi-script .cgi
    AddHandler cgi-script .pl
    AddType text/html .shtml
    AddOutputFilter INCLUDES .shtml
</IfModule>

<FilesMatch "\.php$">
    SetHandler application/x-httpd-php
</FilesMatch>
<FilesMatch "\.phps$">
    SetHandler application/x-httpd-php-source
</FilesMatch>

<Location /cgi-bin/phf*>
    Deny from all
    ErrorDocument 403 http://phf.apache.org/phf_abuse_log.cgi
</Location>
<Location /cgibin/phf*>
    Deny from all
    ErrorDocument 403 http://phf.apache.org/phf_abuse_log.cgi
</Location>

# 'Main' server configuration
#
# The directives in this file set up the values used by the 'main'
# server, which responds to any requests that aren't handled by any
# other <VirtualHost> definition.
#
Include /path.to.apache.config/conf/generic.site

# Virtual hosts
Include /path.to.apache.config/conf/ActiveSites/*.conf

Конфигурация сайта по умолчанию задается generic.site:

<VirtualHost 100.0.193.102:80 192.168.14.202:80>
    ServerAdmin webmaster@occupant591.net
    DocumentRoot "/path.to/generic/www"
    <Directory "/path.to/generic/www">
        Options All MultiViews
        AllowOverride All
        Require all granted
    </Directory>
    ErrorDocument 404 /cgibin/badurl-occ.pl
    ErrorLog "|/usr/local/sbin/rotatelogs /path.to/generic/logs-occ/error_log 86400"
    CustomLog "|/usr/local/sbin/rotatelogs /path.to/generic/logs-occ/access_log 86400" combined
    <IfModule mod_alias.c>
        ScriptAlias /cgibin/ "/path.to/generic/cgibin/"
        <Directory "/path.to/generic/cgibin">
            AllowOverride None
            Options None
            Require all granted
        </Directory>
    </IfModule>
</VirtualHost>

Я попытался исправить это, скопировав файл функциональной конфигурации на файл для Adultemployment.net и обновив имя домена и записи каталога. Это ничего не изменило. Я пробовал несколько разных наборов записей ServerName и ServerAlias, например

    ServerName www.AdultEmployment.net
    ServerAlias *.AdultEmployment.net AdultEmployment.net

и

    ServerName www.AdultEmployment.net
    ServerAlias *.AdultEmployment.net

Я подумал, что проблема может заключаться в том, что в каталоге ActiveSites по алфавиту первым по алфавиту был домен Adultemployment.net, поэтому я добавил еще один домен перед ним - и этот сайт работает так, как ожидалось, но Adultemployment.net по-прежнему не возвращает свою страницу без имени машины.

Сначала я подумал, что это может быть проблема с кешем браузера, но я получаю такое же поведение при доступе к сайту из Firefox и IE на моей машине w2K, Firefox на моем ноутбуке w7 и lynx ssh'd в оболочке внешней хостинговой компании. Я также попытался очистить запись arp для домена на сервере, но безрезультатно.

Я попытался настроить записи DNS и поискал символические ссылки, как предлагалось Вот или записи .htaccess, как предлагается Вот для подобных проблем, но, похоже, ничего не решает эту проблему, когда один сайт на сервере выходит из строя, но все из остальных работают правильно.

Я пытался решить эту проблему более недели, с перерывами, когда я впервые обнаружил ее, и почти непрерывно в течение последних двух дней. Любые подсказки или указатели будут сильно оценен !!

Я наткнулся на «решение» (на самом деле обходной путь, основная причина все еще неизвестна):

Для этот конфигурации (вторая конфигурация Apache загружается во время загрузки), мне пришлось добавить ServerName запись, дублирующая информацию из httpd.conf в файл конфигурации generic.site:

ServerName generic.occupant591

После добавления "по умолчанию" ServerName запись все сайтов, обслуживаемых этот Конфигурация Apache работает правильно. Если аналогичная запись добавлена ​​в Другой конфигурация (первая загружается во время загрузки), сайты, соответствующие "по умолчанию" ServerName запись не удалась.

TL; DR;

Если посетитель попытался получить доступ к несуществующей странице в ненастроенном домене (т.е. должным образом обслуживается через конфигурацию generic.site), например mature.bid/videos, а [core:info] в журнал ошибок внесена запись с сообщением File does not exist: /web/generic-occ/www/videos потому что на общем сайте нет файла или каталога с именем videos Таким образом, Apache не может ответить на запрос. Хотя записи журнала ошибок указывают на то, что запрашиваются несуществующие страницы, они не содержат домен информация о запросах и поэтому действительно просто шум.

Я использовал стандартный "комбинированный" формат журнала Apache для создания журналов доступа. Опять же, в журналах доступа указаны страницы, к которым осуществляется доступ, но не домен, из которого они были запрошены. Для обычных конфигураций, когда в журналах записывается информация для одного домена, это не проблема, но конфигурация generic.site предназначена для все домены, которые иначе не настроены, поэтому регистрация информации о домене обязательный в данном случае быть полезным. К счастью, Apache предоставляет возможности для регистрации информации о домене и %v для "каноническое имя сервера, обслуживающего запрос"казалось именно тем, что мне нужно. Я создал новый оператор LogFormat:

LogFormat "%h %l %u %t %v \"%r\" %>s %b \"%{Referer}i\" \"%{User-Agent}i\"" host_combined

Я перезапустил Apache, попытался загрузить http://adultemployment.net снова и обнаружил, что журнал доступа содержит запись, включающую AdultEmployment.net "GET / HTTP/1.1" Отлично, подумал я, это сработало! - пока я не заметил, что тот же текст записывался при доступе к ненастроенному домену. Возможно, мне следует использовать %V для "имя сервера в соответствии с настройкой UseCanonicalName получить информацию о домене? Я изменил свою команду LogFormat на

LogFormat "%h %l %u %t %V \"%r\" %>s %b \"%{Referer}i\" \"%{User-Agent}i\"" host_combined

затем перезапустил Apache - и обнаружил, что домены с несуществующими страницами регистрируются, как я и ожидал. Теперь у меня есть запись о том, к каким ненастроенным сайтам осуществляется доступ, и какие страницы посетители ожидают от них.

Это заставило меня задуматься, почему LogFormat %v строка записана "AdultEmployment.net" так как "каноническое имя сервера, обслуживающего запрос"- никто конфигурационных файлов написаны таким образом, что AdultEmployment.net должно быть именем сервера по умолчанию. (Для другой конфигурации Apache на этом компьютере %v регистрируемая строка: "Мечтатель"- имя компьютера O / S для сервера.) Я не могу найти страницу сейчас, но во время моего более раннего исследования я столкнулся с ситуацией, когда аналогичная проблема была исправлена ​​путем изменения имени домена, чтобы оно не совпадало с имя сервера операционной системы. Я попытался использовать ssh для IP-адреса этой конфигурации Apache, чтобы увидеть, отображается ли AdultEmployment.net как часть конфигурации операционной системы, но этого не произошло, как я ожидал.

В качестве эксперимента, который, как я ожидал, вызовет проблемы, я попытался добавить ServerName запись в файл конфигурации generic.site:

ServerName Dreamer.occupant591.net

Я думал это может исправить Adaltemployment.net (это было), но я ожидал, что он также сломается Occident591.net, вызывая Это для отображения ненастроенной страницы сайта. Однако это было не сломать "хост-сайт" - по сути, сейчас я не смог найти ничего неудачного.

поскольку apache2ctl -S (как уже упоминалось Вот) недоступен с Apache 2.4 на FreeBSD, я прочитал httpd справочную страницу и нашел -S это вариант, который я могу передать непосредственно демону. С ServerName запись в конфигурации generic.site, httpd -S отчет начинается с

VirtualHost configuration:
192.168.14.202:80      is a NameVirtualHost
         default server Dreamer.occupant591.net (/path.to.apache.config/conf/generic.site:6)
         port 80 namevhost Dreamer.occupant591.net (/path.to.apache.config/conf/generic.site:6)
         port 80 namevhost AAAAAAAAA-Dummy.com (/path.to.apache.config/conf/ActiveSites/AAAAAAAA-Dummy.conf:2)
                 wild alias *.AAAAAAAAA-Dummy.com
         port 80 namevhost AdultEmployment.net (/path.to.apache.config/conf/ActiveSites/AdultEmployment.net.conf:3)
                 wild alias *.AdultEmployment.net

Когда я удаляю ServerName запись из конфигурации generic.site, httpd -S отчет начинается с

VirtualHost configuration:
192.168.14.202:80      is a NameVirtualHost
         default server AdultEmployment.net (/path.to.apache.config/conf/generic.site:6)
         port 80 namevhost AdultEmployment.net (/path.to.apache.config/conf/generic.site:6)
         port 80 namevhost AAAAAAAAA-Dummy.com (/path.to.apache.config/conf/ActiveSites/AAAAAAAA-Dummy.conf:2)
                 wild alias *.AAAAAAAAA-Dummy.com
         port 80 namevhost AdultEmployment.net (/path.to.apache.config/conf/ActiveSites/AdultEmployment.net.conf:3)
                 wild alias *.AdultEmployment.net

Обратите внимание, что без ServerName запись, сервер по умолчанию все еще предположительно установлен на generic.site:6 даже если в файле нет записи ServerName, в строке 6 или любой другой строке файла. Ясно что-то сломано но сейчас у меня нет времени гоняться за этим призраком.

Когда я изначально настраивал эту конфигурацию Apache с двумя экземплярами на сервере, у меня был ServerName запись в конфигурации другого экземпляра, включающая полное доменное имя. Это привело к поломке "основного" сайта, и я исправил который проблема с удалением компонента домена верхнего уровня из ServerName запись в httpd.conf и удаление ServerName запись полностью из файла конфигурации generic.site. Я внес те же изменения в эту конфигурацию, которая, похоже, работала примерно до тех пор, пока я не перенастроил свою сеть, чтобы избавиться от маршрутизатора моего интернет-провайдера. В следующий раз, когда я попытался получить доступ Adaltemployment.net, Я нашел проблему, описанную в моем вопросе.

Теперь я озадачен, почему два экземпляра Apache ведут себя по-разному - но мне придется отложить это расследование до тех пор, пока мне нечего будет делать и персонал, с которым это будет делать ...