A solução está na documentação do Apache 2.2 na diretiva Virtualhost :
Sintaxe: ... (...) Addr pode ser:
- O endereço IP do host virtual;
- Um nome de domínio totalmente qualificado para o endereço IP do host virtual (não recomendado);
- O caractere * , usado apenas em combinação com NameVirtualHost * para corresponder a todos os endereços IP; ou
- A sequência _default_ , usada apenas com hospedagem virtual IP para capturar endereços IP não correspondentes.
Existem duas maneiras de lidar com o Virtualhosts, virtualhosting baseado em nome e virtualhosting baseado em IP.
Com virtualhosts baseados em nomes, você tem uma lista de virtualhosts, cada um gerenciando um ou vários nomes de domínio e cada um associado a um casal listening IP:port
. *
é um valor especial que significa todos os IPs neste host . O virtualHost padrão é o primeiro declarado nesta lista para cada endereço de escuta fornecido.
Com o VirtualHosts baseado em IP, o ServerName
diretiva do VirtualHost não é usada, as informações importantes são o IP de escuta (e a porta) e o VirtualHost padrão é o primeiro que corresponde ao IP que trata da solicitação recebida.
Portanto, com uma configuração de host virtual 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", usarei este host virtual
<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", usarei este host virtual
<Virtualhost 10.0.0.2:*> with Servername foo.com
significa "para solicitação de entrada da minha interface de rede 10.0.0.2", "em todas as portas", "se o cabeçalho do host da solicitação for foo.com", usarei este host virtual
<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 "Vou usar esse host virtual para solicitar a minha interface 10.0.0.2"
<Virtualhost _default_:443>
significa "Vou usar este host virtual para todas as outras interfaces de rede no meu host para solicitar entrada na porta 443"
<Virtualhost _default_:*>
significa "Vou usar este host virtual para todas as outras interfaces de rede no 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 host virtual com base em nome"
Portanto, trata-se de definir um Virtualhost abrangente. A documentação acrescenta:
Ao usar a hospedagem virtual baseada em IP, _default_
é possível especificar o nome especial; nesse caso, esse host virtual corresponderá a qualquer endereço IP que não esteja explicitamente listado em outro host virtual. Na ausência de qualquer _default_
host virtual, a configuração do servidor "principal", que consiste em todas as definições fora de qualquer seção do VirtualHost, é usada quando não ocorre correspondência de IP. (Mas observe que qualquer endereço IP que corresponda a uma diretiva NameVirtualHost não utilizará a configuração "principal" do servidor nem o _default_
host virtual. Consulte a documentação de hospedagem virtual baseada em nome para obter mais detalhes.)
Portanto, depois de tudo isso, fica bastante "claro" que misturar host virtual baseado em IP e em nome possa se tornar uma bagunça. Com o Apache 2.2, o host virtual baseado em nome era usado apenas se NameVirtualhost <something>
fosse usado.
Mas com a nova versão do Apache 2.4, essas coisas são realmente mais fáceis de entender, sem NameVirtualhost
declaração. A diretiva NameVirtualHost não tem mais nenhum efeito, exceto emitir um aviso. Qualquer combinação de endereço / porta que aparece em vários hosts virtuais é implicitamente tratada como um host virtual baseado em nome . Não há mais pensamentos complexos, mesmo a documentação agora é mais simples:
- O caractere *, que atua como um curinga e corresponde a qualquer endereço IP.
- A sequência
_default_
, que é um alias para *
Portanto, com o apache 2.4, a resposta é: é a mesma coisa .