O Host Virtual Padrão do Apache não é carregado na ordem correta

1

Apache / 2.4.6 (CentOS)

Por um tempo, eu tive uma configuração de página grande para o meu servidor Apache, então os bots não rastreariam meu site principal, a menos que eles tivessem meu nome de domínio.

Recentemente, no entanto, notei que isso não funciona mais com minha configuração. Ao carregar a página pelo endereço IP (digamos 10.20.20.10), eu obtenho o site principal (digamos mysite.net) ao invés do catchall.

A configuração é assim:

<VirtualHost _default_:80>
        ServerName default
        # More config ...
</VirtualHost>

<VirtualHost _default_:443>
        ServerName default
        # More config ...
</VirtualHost>

<VirtualHost 10.20.20.10:80>
        ServerName mysite.net
        # More config ...
</VirtualHost>

<VirtualHost 10.20.20.10:443>
        ServerName mysite.net
        # More config ...
</VirtualHost>

A execução de apachectl -S revelou que não está sendo carregado como o padrão:

10.20.20.10:443       is a NameVirtualHost
     default server mysite.net (/etc/httpd/sites-enabled/01-mysite.conf:24)
     port 443 namevhost mysite.net (/etc/httpd/sites-enabled/01-mysite.conf:24)
*:80                   localhost (/etc/httpd/sites-enabled/00-catchall.conf:2)
*:443                  localhost (/etc/httpd/sites-enabled/00-catchall.conf:16)

Consegui encontrar uma maneira de ter meu carregamento completo por padrão, mas foi necessário que eu alterasse meu catchall para o mesmo IP de escuta que meu host virtual principal. Não é a solução mais ideal. Eu imagino que mudar todos os vhosts para * também o faria, mas isso também não é ideal.

Com base na observação, parece que o httpd prefere uma correspondência mais próxima e recebe uma correspondência de IP sobre "*". Alguém pode esclarecer porque o Apache não carrega o primeiro vhost e o que pode consertar isso?

    
por Datus 19.08.2016 / 02:36

1 resposta

0

Eu só estou querendo saber aqui, não faz sentido que, uma vez que mysite.net é o primeiro vhost para VirtualHost 10.20.20.10:80 que se tornaria o site padrão?

Não sei por que _default_ não está funcionando para você. Mas talvez algo assim pudesse funcionar em seu lugar. É isso que você diz que já tentou? O que não é ideal?

<VirtualHost 10.20.20.10:80>
        ServerName default
        # More config ...
</VirtualHost>

<VirtualHost 10.20.20.10:443>
        ServerName default
        # More config ...
</VirtualHost>

<VirtualHost 10.20.20.10:80>
        ServerName mysite.net
        # More config ...
</VirtualHost>

<VirtualHost 10.20.20.10:443>
        ServerName mysite.net
        # More config ...
</VirtualHost>

Esta pergunta / resposta explicaria seu problema se você estivesse usando o Apache 2.2. Mas você não é. Honestamente, não é algo com o qual eu esteja excessivamente familiarizado. Aparentemente, você não deve usar _default_ com hospedagem virtual baseada em nome, em vez de *:* ou *:port .

diferença entre _default_: * e *: * no contexto do VirtualHost

So with a named based virtualhosting configuration:

<Virtualhost *:80> with ServerName foo.com means "on all IPs managed on this host", "on port 80", "if the request host header is foo.com" I'll use this virtualhost
<Virtualhost *:*> with Servername foo.com means "on all IPs managed on this host", "on all ports", "if the request host header is foo.com" I'll use this virtualhost
<Virtualhost 10.0.0.2:*> with Servername foo.com means "for request incoming from my network interface 10.0.0.2", "on all ports", "if the request host header is foo.com" I'll use this virtualhost
<Virtualhost _default_:*> with Servername foo.com : should not be used with name based virtualhosting
And on an IP based Virtualhosting:

<Virtualhost 10.0.0.2:*> means "I'll use this virtualhost for request coming on my 10.0.0.2 interface"
<Virtualhost _default_:443> means "I'll use this virtualhost for all other network interface on my host for request coming on port 443"
<Virtualhost _default_:*> means "I'll use this virtualhost for all other network interface on my host, if it is not matched by a previous rule, and if the request host header is not matched by a named based virtualhost"

Ubuntu igual a você Tentei atribuir um IP a um dos vhosts (example2.com) em vez de <VirtualHost *:80> e agora substitui o vhost padrão. Parece que é assim que o Apache funciona. Um * não pode substituir um endereço IP. curl 192.168.1.143 agora me dá example2.com em vez da página catchall.

$ sudo apachectl -S
VirtualHost configuration:
192.168.1.143:80       example2.com (/etc/apache2/sites-enabled/example2.com.conf:1)
*:80                   is a NameVirtualHost
         default server www1.swass (/etc/apache2/sites-enabled/000-default.conf:1)
         port 80 namevhost www1.swass (/etc/apache2/sites-enabled/000-default.conf:1)
         port 80 namevhost example.com (/etc/apache2/sites-enabled/example.com.conf:1)
                 wild alias *.example.com

Melhor da sorte

    
por 19.08.2016 / 03:00