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

Как отлаживать виртуальные хосты Apache2

Я размещаю два сайта на одном сервере. У каждого есть свой собственный VirtualHost. Первый сайт работает нормально, но когда я пытаюсь получить доступ ко второму, меня перенаправляют на первый. Это похоже на то, что Apache не распознает правильный VirtualHost по ServerName и перенаправляет меня на сайт по умолчанию (первый).

Есть ли журнал или что-то еще, где я могу увидеть, какие шаги предпринимает Apache, когда обрабатывает мой запрос? Регистрирует ли он где-нибудь, какое имя сервера он использует, когда пытается найти соответствующий VirtualHost?

Обновить:

Я добавил раздел VirtualHost для поддомена моего второго сайта, и это работает. Он отображает страницу с правильного сервера приложений, который работает в порту 8501, когда я ввожу "interface.domain.com" в свой браузер. Но когда я пробую "www.domain.com", он перенаправляется на мой первый сайт.

Ниже мой файл виртуального хоста для второго сайта.

<VirtualHost *:80>
  ServerName www.domain.com
  DocumentRoot /home/domain/current/public

  RewriteEngine On
  RewriteCond %{REQUEST_FILENAME} !-f
  RewriteRule ^/(.*)$ http://localhost:8501/$1 [P]
</VirtualHost>

<VirtualHost *:80>
  ServerName interface.domain.com
  DocumentRoot /home/domain/current/public

  RewriteEngine On
  RewriteCond %{REQUEST_FILENAME} !-f
  RewriteRule ^/(.*)$ http://localhost:8501/$1 [P]
</VirtualHost>

apache2ctl -S

AH00558: apache2: Could not reliably determine the server's fully qualified domain name, using 1.2.3.4. Set the 'ServerName' directive globally to suppress this message
VirtualHost configuration:
1.2.3.4:443        www.domainfirst.com (/etc/apache2/sites-enabled/https_www_domainfirst_com.conf:1)
1.2.3.4:80         is a NameVirtualHost
         default server domainfirst.com (/etc/apache2/sites-enabled/domainfirst_com.conf:1)
         port 80 namevhost domainfirst.com (/etc/apache2/sites-enabled/domainfirst_com.conf:1)
         port 80 namevhost www.domainfirst.com (/etc/apache2/sites-enabled/www_domainfirst_com.conf:1)
*:80                   is a NameVirtualHost
         default server domain.com (/etc/apache2/sites-enabled/domain_com.conf:1)
         port 80 namevhost domain.com (/etc/apache2/sites-enabled/domain_com.conf:1)
         port 80 namevhost www.domain.com (/etc/apache2/sites-enabled/www_domain_com.conf:1)
         port 80 namevhost interface.domain.com (/etc/apache2/sites-enabled/www_domain_com.conf:10)
ServerRoot: "/etc/apache2"
Main DocumentRoot: "/var/www/html"
Main ErrorLog: "/var/log/apache2/error.log"
Mutex watchdog-callback: using_defaults
Mutex rewrite-map: using_defaults
Mutex ssl-stapling: using_defaults
Mutex proxy: using_defaults
Mutex ssl-cache: using_defaults
Mutex default: dir="/var/lock/apache2" mechanism=fcntl 
PidFile: "/var/run/apache2/apache2.pid"
Define: DUMP_VHOSTS
Define: DUMP_RUN_CFG
User: name="www-data" id=33
Group: name="www-data" id=33

Решение:

Очистите кеш браузера. В моем браузере было кэшировано правило перенаправления запроса на другой сайт.

Делать не смешайте определения IP: port и *: port в вашем <VirtualHost> теги, если вы не очень опытный администратор Apache и точно не знаете, что делаете.

Любой домен, который разрешается 1.2.3.4 (в вашем примере) будет обслуживаться вашим, привязанным к 1.2.3.4:80, независимо от того, какое имя хоста используется.

Если имена серверов и сервер появляются на вашем виртуальном хосте *: 80 не решить 1.2.3.4, тогда что-то еще не так. Если они разрешат этот IP-адрес, просто измените вас <VirtualHost 1.2.3.4:80> к <Virtualhost *:80>

Дополнительный комментарий: если у вас только 1 IP на вашем сервере, используйте только версию *: port, это позволит избежать путаницы

Дополнительные комментарии: Частично проблема может заключаться в том, как вы дезинфицируете все доменные имена. этот должен делаться последовательно, иначе наши усилия будут напрасными. Apache определяет, на какой сервер отправить запрос, следующим образом. Это просто работает, любой ошибка в этом процессе никогда не выдержит даже самого элементарного тестирования для выпуска Apache:

  • Если соединение осуществляется с определенным IP-адресом, а apache имеет единственное соответствие <VirtualHost> тег для этого IP / порта, тогда этот виртуальный хост получит запрос
  • Если нет, apache смотрит на ServerName и ServerAlias директивы для любых <VirtualHost> который соответствует IP / порту, к которому пришло соединение, и соответствует HTTP Host заголовок, который пришел с запросом. Первый <VirtualHost> на выходе apachectl -S это совпадение и получит запрос.
  • Если совпадений не найдено, то запрос получает виртуальный хост по умолчанию для этого IP / порта. Это первый виртуальный hjost, указанный в выводе apachectl -S для конкретной комбинации ip / port.

Помните IP может быть просто *.