Como depurar hosts virtuais do Apache2

2

Estou hospedando dois sites em um servidor. Cada um tem seu próprio VirtualHost definido. O primeiro site funciona bem, mas quando tento acessar o segundo, sou redirecionado para o primeiro. É como se o Apache não reconhecesse o VirtualHost correto pelo ServerName e me redirecionasse para o site padrão (primeiro).

Existe um log ou algo em que eu possa ver quais etapas o Apache está tomando quando lida com a minha solicitação? Faz log em qualquer lugar o que ServerName está usando quando ele tenta encontrar um VirtualHost correspondente?

Atualização:

Eu adicionei uma seção VirtualHost para um subdomínio do meu segundo site e isso funciona. Ele processa a página do servidor de aplicativos correto que é executado na porta 8501 quando eu insiro "interface.domain.com" no meu navegador. Mas quando eu tento "www.domain.com" ele redireciona para o meu primeiro site.

Abaixo está o meu arquivo host virtual para o segundo site.

<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

Solução:

Limpe o cache do navegador. Meu navegador armazenou em cache uma regra para encaminhar solicitações para o outro site.

    
por Mika 17.11.2016 / 10:54

1 resposta

2

Não misture as definições IP: port e *: port nas tags <VirtualHost> , a menos que você seja um administrador Apache muito experiente e saiba exatamente o que está fazendo.

Qualquer domínio que resolva para 1.2.3.4 (em seu exemplo) será atendido por seu um vinculado a 1.2.3.4:80, independentemente do nome do host usado.

Se os nomes dos servidores e os alaises do servidor em seu host virtual *: 80 não forem resolvidos para 1.2.3.4, então algo está errado. Se eles resolverem esse IP, basta alterar você <VirtualHost 1.2.3.4:80> para <Virtualhost *:80>

Comentário adicional: Se você tiver apenas 1 IP no seu servidor, use somente a versão *: port, isso evitará confusão

Mais comentários: Parte do problema pode ser a maneira como você está higienizando todos os nomes de domínio. isso deve ser feito de forma consistente, caso contrário nossos esforços serão em vão. A maneira como o apache decide para qual servidor enviar uma solicitação é o seguinte. Isso simplesmente funciona, qualquer bug nesse processo nunca poderia sobreviver até mesmo no teste mais básico para uma versão do Apache:

  • Se a conexão for para um endereço IP específico e o apache tiver uma única tag <VirtualHost> correspondente para esse ip / port, esse host virtual receberá a solicitação
  • Se não, o apache examina as diretivas ServerName e ServerAlias de qualquer <VirtualHost> que corresponda ao IP / porta na qual a conexão entrou e corresponde ao cabeçalho HTTP Host que veio com a solicitação. O primeiro <VirtualHost> na saída de apachectl -S que corresponde será o único a receber o pedido.
  • Se nenhuma correspondência for encontrada, o host virtual padrão para esse IP / porta receberá a solicitação. Este é o primeiro hjost virtual listado na saída de apachectl -S para uma combinação ip / port específica.

Lembre-se de que o IP pode ser apenas * .

    
por 17.11.2016 / 11:39