Como desativar o VirtualHost padrão no apache2?

10

No apache2 por design, qualquer solicitação http com um host desconhecido será direcionada para o primeiro VirtualHost carregado. Existe uma maneira de desativar esse recurso? Dito de forma diferente, eu quero ter um servidor web em que o usuário possa acessar apenas definições de VirtualHost explicitamente nomeadas. Qualquer outro nome de host não mencionado explicitamente em uma linha ServerName ou ServerAlias ​​deve ser ignorado silenciosamente.

Isso é possível?

Listen 80
NameVirtualHost *

<VirtualHost _default_:*>
# Anything matching this host should be silently ignored.
</VirtualHost>

<VirtualHost *>
DocumentRoot /www/example1
ServerName www.example.com
</VirtualHost>

<VirtualHost *>
DocumentRoot /www/example2
ServerName www.example.org
</VirtualHost>

Atualização: Como sugerido abaixo e em outros lugares, ignorar silenciosamente uma solicitação pode não ser uma boa idéia e talvez quebre as RFCs para HTTP. No entanto, como os hosts virtuais são projetados para simular vários servidores HTTP físicos separados, a abordagem de ignorar silenciosamente não me parece irracional. Seria o mesmo que hospedagem virtual baseada em IP e firewall de alguns dos IPs (talvez não para todos os clientes).

Harvey
fonte

Respostas:

4

Não tenho certeza de que "falhar silenciosamente" seja uma boa ideia. Você deve dar ao cliente pelo menos alguma indicação do que aconteceu. Talvez você possa enviar um erro http 410 "desaparecido". Algo assim deve fazer o truque:

RewriteRule ^.*$ - [G]

Além disso, você deve poder especificar um documento de erro 410 personalizado, que pode ser apenas uma página html em branco.

EEAA
fonte
Acabei descobrindo essa solução por conta própria também. Você deve adicionar linhas para carregar mod_rewrite e "RewriteEngine On", observando que eles podem não ser necessários. Eles eram para mim. :)
Harvey
2
Além disso, como estamos dizendo Gone or Forbidden e, mais importante, o "-" impede a substituição, o regex pode ser muito mais simples:RewriteRule . - [F]
Harvey
17

Aqui está uma maneira alternativa que não envolve reescrever regras:

<VirtualHost _default_:*>
    <Location />
        Deny from all
        Options None
        ErrorDocument 403 Forbidden.
    </Location>
</VirtualHost>
atomsmith
fonte
2
Essa deve ser a solução aceita. +1
Greg Schmit
Não estou claro sobre esta solução. Tenho vários arquivos VHOST e faço apenas um novo com isso? Eu tentei isso e chamei o arquivo 001.default.conf, mas ainda tenho o redirecionamento dos meus subdomínios.
Frantumn
@Frantumn Conforme observado na pergunta, "qualquer solicitação http com um host desconhecido será direcionada para o primeiro VirtualHost carregado ". Este "padrão" <VirtualHost>deve, portanto, ser definido primeiro na configuração do servidor. Precisamente qual arquivo deve estar depende da sua configuração. (No entanto, o seu "subdomínios redirecionadas" questão poderia ser um problema não relacionado.)
MrWhite
Hã. Ao usar outros domínios que apontam para o meu servidor, ele não faz o 403, ele simplesmente pega o primeiro virtualhost que encontra, mesmo que o nome do servidor não é um jogo
jjxtra
1

isso funcionou para mim

<VirtualHost x.x.x.x:80 [x:x::x:x:x:x]:80>
  ServerName myactualservername.com
  ServerAlias *
  <Location />
    Deny from all
    Options None
    ErrorDocument 403 Forbidden.
  </Location>
</VirtualHost>

substitua xxxx pelo seu ipv4 e ipv6 reais,
substitua myactualservername.com por um site real atendido pela máquina

Estou usando o host virtual baseado em nome.
o crédito para esta solução vai para
https://serverfault.com/a/82309/459796

Yashesh Bhatia
fonte