A solução está na documentação do Apache 2.2 na diretiva Virtualhost :
Syntax: ... (...) Addr can be:
- The IP address of the virtual host;
- A fully qualified domain name for the IP address of the virtual host (not recommended);
- The character *, which is used only in combination with NameVirtualHost * to match all IP addresses; or
- The string _default_, which is used only with IP virtual hosting to catch unmatched IP addresses.
Existem duas maneiras de lidar com Virtualhosts, Virtualhosting baseado em nome e Virtualhosting baseado em IP.
Com virtualhosts baseados em nome, você tem uma lista de virtualhosts, cada um gerenciando um ou vários nomes de domínio, e cada um associado a um par listening IP:port
. *
é um valor especial que significa todos os IPs neste host . O virtualHost padrão é o primeiro declarado nessa lista para cada endereço de escuta.
Com VirtualHosts baseados em IP, a diretiva ServerName
do VirtualHost não é usada, as informações importantes são o IP (e a porta) de escuta e o VirtualHost padrão é o primeiro que corresponde ao IP que atende a solicitação recebida.
Portanto, com uma configuração virtualhosting baseada em nome:
-
<Virtualhost *:80> with ServerName foo.com
significa "em todos os IPs gerenciados neste host", "na porta 80", "se o cabeçalho do host de solicitação for foo.com", utilizarei este virtualhost -
<Virtualhost *:*> with Servername foo.com
significa "em todos os IPs gerenciados neste host", "em todas as portas", "se o cabeçalho do host de solicitação for foo.com", utilizarei este virtualhost -
<Virtualhost 10.0.0.2:*> with Servername foo.com
significa "para solicitação recebida da minha interface de rede 10.0.0.2", "em todas as portas", "se o cabeçalho do host de solicitação for foo.com" Usarei este virtualhost -
<Virtualhost _default_:*> with Servername foo.com
: não deve ser usado com virtualhosting baseado em nome
E em um Virtualhosting baseado em IP:
-
<Virtualhost 10.0.0.2:*>
significa "Eu usarei este virtualhost para solicitação na minha interface 10.0.0.2" -
<Virtualhost _default_:443>
significa "Usarei este host virtual para toda a outra interface de rede no host para solicitação na porta 443" -
<Virtualhost _default_:*>
significa "Usarei este host virtual para toda a outra interface de rede em meu host, se não corresponder a uma regra anterior e se o cabeçalho do host de solicitação não corresponder a um nome com base virtualhost "
Então, tudo se resume a definir um Virtualhost catch-all. A documentação adiciona:
When using IP-based virtual hosting, the special name
_default_
can be specified in which case this virtual host will match any IP address that is not explicitly listed in another virtual host. In the absence of any_default_
virtual host the "main" server config, consisting of all those definitions outside any VirtualHost section, is used when no IP-match occurs. (But note that any IP address that matches a NameVirtualHost directive will use neither the "main" server config nor the_default_
virtual host. See the name-based virtual hosting documentation for further details.)
Então, depois de tudo isso, torna-se bastante "claro" que misturar virtualhosting baseado em IP e nome pode se tornar uma bagunça. Com o Apache 2.2, o virtualhosting baseado em nome era usado somente se NameVirtualhost <something>
fosse usado.
Mas com a nova versão do Apache 2.4 as coisas são realmente mais fáceis de entender, nenhuma declaração NameVirtualhost
. A diretiva NameVirtualHost não tem mais nenhum efeito além de emitir um aviso. Qualquer combinação de endereço / porta que apareça em vários hosts virtuais é implicitamente tratada como um host virtual baseado em nome . Não há mais complexos, mesmo a documentação é agora mais simples:
- The character *, which acts as a wildcard and matches any IP address.
- The string
_default_
, which is an alias for *
Então, com o apache 2.4, a resposta é é a mesma coisa .