Por que o Apache pode ignorar um host virtual com um ServerName correspondente à URL solicitada?

26

Estou tentando adicionar um segundo host virtual à minha configuração do apache, mas não consigo obter o novo host virtual a ser usado.

Meu httpd.confapenas contém a seguinte linha:

ServerName radiofreebrighton.org.uk

Eu também tenho um ports.confarquivo que contém o seguinte:

NameVirtualHost *:80
Listen 80

<IfModule mod_ssl.c>
    Listen 443
</IfModule>

Eu tenho dois arquivos nos sites-availablequais foram vinculados sites-enabledpor a2ensite:

  • radiofreebrighton.org.uk
  • trafalgararches.co.uk

O conteúdo do primeiro é:

<VirtualHost _default_:80>
    DocumentRoot /home/tom/www

    ServerAdmin [email protected]
    ServerName radiofreebrighton.org.uk
    ServerAlias www.radiofreebrighton.org.uk

    <Directory /home/tom/www/>
            Options Indexes FollowSymLinks MultiViews
            AllowOverride All
            Order allow,deny
            allow from all
    </Directory>

    ErrorLog /var/log/apache2/error.log
    LogLevel error
    CustomLog /var/log/apache2/access.log combined

    Alias /wiki /home/tom/www/mediawiki/index.php
</VirtualHost>

O conteúdo deste último é:

<VirtualHost *:80>
    DocumentRoot /home/tom/tata-www

    ServerAdmin [email protected]
    ServerName trafalgararches.co.uk
    ServerAlias www.trafalgararches.co.uk

    <Directory /home/tom/tata-www/>
            Options Indexes FollowSymLinks MultiViews
            AllowOverride All
            Order allow,deny
            allow from all
    </Directory>

    logLevel error
    ErrorLog /var/log/apache2/error.log
</VirtualHost>

Mas sempre que solicito uma página de trafalgararches.co.uk, recebo uma página de radiofreebrighton.org.uk. Por que isso pode estar acontecendo? Como posso corrigir isso?


Editar:

Configuração do host virtual conforme entendido pelo apache:

tom@rfb:/usr/local$ apache2ctl -S
VirtualHost configuration:
wildcard NameVirtualHosts and _default_ servers:
*:80                   is a NameVirtualHost
         default server radiofreebrighton.org.uk (/etc/apache2/sites-enabled/radiofreebrighton.org.uk:1)
         port 80 namevhost radiofreebrighton.org.uk (/etc/apache2/sites-enabled/radiofreebrighton.org.uk:1)
         port 80 namevhost trafalgararches.co.uk (/etc/apache2/sites-enabled/trafalgararches.co.uk:1)
Syntax OK

(Coletado via apache2ctl -Saka httpd -S.)

Tom Wright
fonte
1
Não sei se essa é a causa, mas você deve remover as barras das extremidades das linhas ServerNamee ServerAlias. Além disso, verifique se você reiniciou o apache.
EEAA
Tenho quase certeza de que é a causa. Isso significa que o nome do host na solicitação nunca corresponderá ao ServerName desse host virtual.
Larsks
1
@ErikA, @larsks - Vocês têm minhas esperanças! Tirei as barras à direita e reiniciei o apache, mas não mudou nada.
22611 Tom
1
Você tem NameVirtualHost *:80algum lugar na sua configuração?
Larsks
1
Não tenho certeza se os sites mencionados acima são de produção ou desenvolvimento, mas, na verdade, acessar esses URLs fornece duas páginas diferentes para mim (páginas corretas pela aparência). Se os vhosts acima estiverem em um servidor de desenvolvimento, ignore este comentário. Caso contrário, você pode ter corrigido o problema em algum lugar do caminho e ainda assim ter uma cópia em cache.
82611 cyberx86

Respostas:

15

Bem, essa pergunta tem mais de um ano, mas eu me deparei com um "problema" semelhante. Isso pode ser óbvio, mas não esqueça de reiniciar o serviço apache depois de ativar um host virtual adicional. Veja, após executar a2ensitepara o segundo host virtual, a saída de apache2ctl -Smostrará que os dois sites estão disponíveis (e um deles é o padrão), mesmo se você não recarregou o apache.

Digamos que você tenha dois hosts virtuais - site1 e site2. Você executa a2ensite site1e recarrega o serviço apache. Agora você pode acessar http://site1e é o padrão. Agora você corre a2ensite site2, mas esqueça de reiniciar o apache. A saída de apache2ctl -Sserá:

VirtualHost configuration:
wildcard NameVirtualHosts and _default_ servers:
*:80                   is a NameVirtualHost
         default server site1 (/etc/apache2/sites-enabled/site1:1)
         port 80 namevhost site1 (/etc/apache2/sites-enabled/site1:1)
         port 80 namevhost site2 (/etc/apache2/sites-enabled/site2:1)
Syntax OK

Mas quando você tenta carregar http://site2, ele realmente carrega o site padrão (site1), pois a configuração não está carregada.

prngleo
fonte
Recebo a mesma saída, mas mesmo assim ele não carrega o segundo site.
arqam 24/09
15

Eu tive um problema semelhante em que meus vhosts adicionais na porta 443 (SSL / HTTPS) estavam todos sendo direcionados para o diretório do primeiro vhost listado. O Apache estava basicamente ignorando a propriedade servername e correspondendo apenas na porta ip:.

Acontece que estava faltando o comando 'NameVirtualHost *: 443' para ativar a hospedagem virtual nomeada para a porta 443.

'NameVirtualHost *: 443' só precisa ser chamado uma vez e deve ser definido acima dos seus vhosts para a porta 443. Coloquei minha definição no arquivo ports.config para que se pareça com:

NameVirtualHost *:80
Listen 80

<IfModule mod_ssl.c>
    NameVirtualHost *:443
    Listen 443
</IfModule>

<IfModule mod_gnutls.c>
    NameVirtualHost *:443
    Listen 443
</IfModule>

Não se esqueça de reiniciar o apache após quaisquer alterações.

Lucas
fonte
1
Por que vale a pena ... em Apache 2.4.18, utilizando NameVirtualHostproduz esta mensagem na inicialização:AH00548: NameVirtualHost has no effect and will be removed in the next release /etc/apache2/ports.conf
Lambart
4

Meus 2 centavos: como eu tenho que ficar com um IP (não quero que o site seja veiculado em todas as redes instaladas), aconteceu que após a alteração do IP privado local do servidor, esqueci de alterá-lo aqui:

NameVirtualHost 192.168.100.20:80 <VirtualHost 192.168.100.20:80>

É claro que não é um problema do Apache informar que o IP não existe localmente.

maraboshi
fonte
2

Tom, veja aqui http://httpd.apache.org/docs/2.0/en/mod/core.html#namevirtualhost

Nota

Observe que o "servidor principal" e quaisquer servidores padrão nunca serão atendidos para uma solicitação para um endereço IP NameVirtualHost (a menos que, por algum motivo, você especifique NameVirtualHost, mas não defina nenhum VirtualHosts para esse endereço).

Portanto, tudo bem se você alterar o padrão para o endereço IP do seu servidor.

Marcel Kronenberg
fonte
Eu tentei isso, mas não mudou nada. Eu também gostaria de evitar me vincular a um IP específico, então vou alterá-lo novamente. Além disso, devo salientar que o vhost padrão é o que funciona.
21411 Tom
1

Acho a resposta aqui: http://alexking.org/blog/2007/11/01/apache-2-only-serves-first-virtual-host

Coloque 2 servername na mesma tag 1 VirtualHost como abaixo:

<VirtualHost *:80>
ServerName beta-site-1.com
DocumentRoot "/Library/WebServer/beta-site-1"

ServerName beta-site-2.com
DocumentRoot "/Library/WebServer/beta-site-2"
</VirtualHost>

Acabei tendo problemas com o segundo site porque tinha dois blocos de tags do VirtualHost.

Tu Uyen
fonte
0

Eu tive esse problema ao migrar sites para um novo servidor Ubuntu 16. Depois de um pouco de esforço, percebi que o módulo SSL não estava ativado por padrão; portanto, qualquer coisa dentro dos <IfModule mod_ssl.c>blocos é ignorada silenciosamente.

Anos atrás, envolvi todos os meus fantasmas SSL neste condicional e, desta vez, acabei de copiar os arquivos de configuração para o novo servidor.

Corrigi-o ativando o módulo:

sudo a2enmod ssl
scipilot
fonte
0

Descobri que a origem desse problema era uma entrada / etc / hosts no meu servidor com a URL apontando para o IP externo do servidor.

Em um ponto, eu devo tê-lo configurado antes do DNS estar pronto, então digitei uma entrada / etc / hosts no meu servidor apontando para seu próprio IP externo:

1.2.3.4 vhost.example.com

Em seguida, configurei um ServerAlias ​​para um site existente para "vhost.example.com"

Mas nada que eu pudesse fazer impediria o Apache de fornecer o site default-ssl.conf para solicitações de SSL para vhost.example.com. O HTTP da porta 80 funcionou bem, mas o SSL sempre mostrava o site padrão. No final, esse tópico do SO me levou a tentar o "apachectl -S", que mostra sites, e finalmente consegui descobrir.

Portanto, se você está obtendo o site SSL padrão em vez do site que você espera, certifique-se de não adicionar o endereço IP externo do seu servidor em uma entrada / etc / hosts! Uma coisa bem estranha de se fazer em retrospectiva, mas espero que isso ajude outra pessoa!

Professor Falken
fonte