Host virtual padrão / catch-all do Apache?

67

Se eu tiver três domínios, domain1.com, domain2.com e domain3.com, é possível configurar um host virtual padrão para domínios não listados? Por exemplo, se eu tivesse:

<VirtualHost 192.168.1.2 204.255.176.199>
DocumentRoot /www/docs/domain1
ServerName domain1
ServerAlias host
</VirtualHost>

<VirtualHost 192.168.1.2 204.255.176.199>
DocumentRoot /www/docs/domain2
ServerName domain2
ServerAlias host
</VirtualHost>

<VirtualHost 192.168.1.2 204.255.176.199>
DocumentRoot /www/docs/everythingelse
ServerName *
ServerAlias host
</VirtualHost>

Se você registrar um domínio e apontá-lo para o meu servidor, o padrão será o restante, mostrando o mesmo que domínio3. Isso é possível?

SJaguar13
fonte

Respostas:

45

Sim, isso deve funcionar, exceto ServerAlias ​​deve ser "*", com ServerName definido como um nome de host real. Pode ser necessário garantir que o VirtualHost seja o último carregado ...

freiheit
fonte
Deveria funcionar, mas não. Se um domínio não estiver listado especificamente, eu recebo "O Firefox não consegue encontrar o servidor".
SJaguar13
2
Você o definiu como "host do ServerName" e "ServerAlias ​​*"? Não enfatizei isso o suficiente originalmente, mas o ServerName não aceita caracteres curinga, apenas o ServerAlias. ServerName precisa ser um nome de host real.
Freiheit
Além disso, os outros virtualhosts funcionam? Qual versão do apache?
Freiheit
"O Firefox não consegue encontrar o servidor." não é um problema apache. Você precisa de mais detalhes (o servidor se algum é contactado, o que é o código de erro ...)
Law29
Estranho que não funcione para mim, ele sempre escolhe o primeiro host
virtual
80

Ao usar hosts virtuais baseados em nome, a primeira configuração de host virtual carregada será o padrão (Fonte: Wiki do Apache ). Por exemplo, com a configuração abaixo, os domínios não correspondentes corresponderão a domain-one.com:

NameVirtualHost *:80

<VirtualHost *:80>
  ServerName domain-one.com
  # Other options and directives ..
</VirtualHost>

<VirtualHost *:80>
  ServerName domain-two.com
  # Other options and directives ..
</VirtualHost>

Muitos servidores não possuem um arquivo de configuração monolítico, mas possuem vários arquivos de configuração específicos do host, organizados da seguinte maneira:

/etc/apache2
|-- sites_available  (actual configuration files)
`-- sites_enabled    (symlinks to files in sites_available)

Nesse caso, para fazer com que uma configuração específica de host virtual seja carregada primeiro, renomeie o link simbólico para algo que será o primeiro quando classificado, como 00-default.


Algumas das outras respostas não estão totalmente corretas. De acordo com o Apache Wiki, não definir a ServerNameem um host virtual está incorreto. Se o host sem um ServerNamenão for carregado primeiro, o Apache nem poderá usá-lo, pois o primeiro host carregado será o padrão.

Além disso, embora de ServerAlias *fato corresponda a qualquer coisa, também pode substituir outros hosts virtuais definidos posteriormente. Talvez essa abordagem funcione se for sempre o último host virtual a ser definido (como na configuração fornecida na pergunta), mas isso significa adicionar uma nova diretiva e alterar a ordem de classificação em vez de apenas alterar a ordem como acima.

Jason Blevins
fonte
+ 1 milhão de internets para você, senhor! Tem que ser o primeiro a ser o padrão.
21712 Ryan
Você sabe qual vem primeiro, httpd.conf ou conf.d / xyz.conf?
Esa Varemo 16/09/12
2
"a primeira configuração de host virtual carregada será o padrão" resolveu meu problema com domínios SSL locais no XAMPP (Windows). Parece que o Apache usa o primeiro vhost como padrão para cada porta; portanto, para lidar adequadamente com domínios não correspondentes para solicitações não seguras / protegidas, deve haver 2 configurações "padrão" explícitas para as portas 80/443 definidas no início dehttpd-vhosts.conf
Wirone
11
@EsaVaremo - httpd.conf será carregado primeiro e terá uma linha de Inclusão que origina conf.d / xyz.conf (ou provavelmente conf.d / *). qualquer configuração (incluindo vhosts) antes da linha Incluir será processada primeiro; qualquer coisa após a linha de inclusão é processada após os arquivos incluídos.
Dan Pritts
7

Não especifique um nome de servidor e esse se tornará seu vhost padrão.

<VirtualHost *:80>
ServerAdmin webmaster@localhost

DocumentRoot /var/www
<Directory />
    Options FollowSymLinks
    AllowOverride None
</Directory>
<Directory /var/www/>
    Options Indexes FollowSymLinks MultiViews
    AllowOverride None
    Order allow,deny
    allow from all
</Directory>
</VirtualHost> 

Verifique também se você não especificou um DocumentRoot no arquivo httpd.conf principal, pois isso terá precedência sobre os vhosts.

Vid Luther
fonte
Eu tenho isso como o primeiro host virtual listado e ainda recebo "O Firefox não consegue encontrar o servidor".
precisa saber é o seguinte
2
Discordo. Eu tive meu primeiro host virtual definido sem um ServerName, no entanto, parece conflitar com alguns hosts virtuais, mas não com outros. Resolvi o problema adicionando um ServerName, mas definindo-o para um domínio aleatório que não está no meu servidor. Como é o primeiro host virtual, é usado como padrão, mas só corresponde quando um domínio que não corresponde a qualquer outro ServerName é usado.
joshaidan
3

A ordem é importante - mova sua definição de vhost para todo o resto para o topo da lista.


fonte
2

Use o host virtual _default_ e coloque-o primeiro no httpd-vhosts.conf, conforme especificado em http://httpd.apache.org/docs/2.2/vhosts/examples.html

"Capturando todas as solicitações para qualquer endereço IP e porta não especificados, ou seja, uma combinação de endereço / porta que não é usada para nenhum outro host virtual. [...] Um vhost padrão nunca atende a uma solicitação que foi enviada para um endereço / porta que seja usado para vhosts baseados em nome. Se a solicitação continha um cabeçalho Host: desconhecido ou nenhum é sempre atendido pelo vhost primário baseado em nome (o vhost para esse endereço / porta que aparece primeiro no arquivo de configuração). "

Trecho de um httpd-vhosts.conf ativo, mas ofuscado, que bloqueia todos os vhosts na porta 80:

# Listen for virtual host requests on all IP addresses.
# This directive cannot be removed:
NameVirtualHost *:80

<VirtualHost _default_:80>
# This vhost catches client requests with host headers which have
# not been matched by ServerName or ServerAlias directives in other vhosts.
#
# We redirect all such requests to a particular named vhost:
    RewriteCond %{HTTP_HOST}    ^(.*)$
    RewriteRule ^(.*)$  http://my.site.of.choice [R=permanent,L]
</VirtualHost>

# Name based vhosts here:
<VirtualHost *:80>
    ServerAdmin webmaster@localhost
    ServerName  my.other.site
    ServerAlias my.other.site2 my.other.site3
</VirtualHost>

# more vhosts etc...

Uma explicação detalhada do processo de correspondência de vhost pode ser encontrada aqui: http://httpd.apache.org/docs/2.2/vhosts/details.html

ErikE
fonte
2
_default_é usado apenas para IPs sem correspondência , portanto, quando você tiver o vhost curinga (*: 80), ele nunca será usado.
Wirone
2

Curinga incluem os arquivos de configuração do site:

Include path/to/site/confs/*httpd.conf

Organize os arquivos conf do site para que eles sejam carregados na ordem esperada. Exemplo...

01-httpd.conf

02-site1-httpd.conf

03-site2-httpd.conf

etc ...

O Apache os lerá em ordem. Em seguida, crie um que sempre carregue por último para capturar hosts virtuais não correspondentes e retorne um 404 em vez de carregar um site padrão.

99-catchall-httpd.conf

<VirtualHost *:8080>
 ServerName null
 ServerAlias *
 Redirect 404 /
</VirtualHost>

<VirtualHost *:8443>
 ServerName null
 ServerAlias *
 Redirect 404 /
</VirtualHost>

Certifique-se de substituir as portas pelas portas em que o httpd estiver escutando. Ou, se você tiver o httpd ouvindo em interfaces específicas, precisará adicionar um catchall para cada interface, da seguinte maneira:

<VirtualHost 192.168.1.101:8080>
 ServerName null
 ServerAlias *
 Redirect 404 /
</VirtualHost>
<VirtualHost 192.168.1.101:8443>
 ServerName null
 ServerAlias *
 Redirect 404 /
</VirtualHost>

<VirtualHost 192.168.1.102:8080>
 ServerName null
 ServerAlias *
 Redirect 404 /
</VirtualHost>

<VirtualHost 192.168.1.102:8443>
 ServerName null
 ServerAlias *
 Redirect 404 /
</VirtualHost>

Espero que isto ajude. Eu uso esse método para carregar sites na ordem em que especifico e impeço que hosts virtuais incomparáveis ​​carreguem um site inesperado acidentalmente.

Jason Slobotski
fonte
1

A melhor solução é renomear o arquivo de configuração do site, começando com um "1", para que ele seja carregado primeiro e esse seja o site padrão.

O Apache2 cria o primeiro arquivo vhost carregado como a página padrão.

xoompa
fonte
a instalação padrão do apache também possui 000-defaulthost virtual por esse motivo.
fácil
0

ao usar <VirtualHost *:port>e especificar ServerName / ServerAlias ​​para os hosts de seu interesse, e era isso que eu precisava fazer.

Um pouco de fundo na minha situação:

Eu tenho um endereço IP dinâmico do meu ISP; portanto, meu endereço IP está registrado em uma empresa de registro de endereços IP dinâmico (noip.org no meu caso). Um dos meus "hosts" precisava ser registrado no meu registro DNS como myabc.example.com como um CNAME que aponta para host1.ddns.net. Mas o host2.ddns.net foi deixado como está. Eu queria que myabc.example.com e host1.ddns.net fossem para o site1 e host2.ddns.net para o site 2 e qualquer outra coisa, incluindo meu endereço IP, para o padrão.

A primeira leitura do arquivo conf será o padrão, ou seja 000_def.conf, 001_site1.conf, 002_site2.confserá lido nessa ordem com 000_def.confque o site padrão. (nota: no meu caso, eu tenho esses "arquivos" nos /etc/apache2/sites-enabledquais são realmente links dinâmicos para o arquivo conf real /etc/apache2/sites-available)

Como ServerName está sendo usado em 001_site1.conf e 002_site2.conf, ele também deve ser definido como algo em 000_def.conf.

# 000_def.conf:
<VirtualHost *:80>  
ServerName null
# NOTE: DO NOT USE "ServerAlias *" this seems to override the other conf files.
</VirtualHost>


# 001_site1.conf
<VirtualHost *:80>  
ServerName myabc.example.com
ServerAlias mylocalhostname host1.ddns.net
</VirtualHost>


# 002_site2.conf:
<VirtualHost *:80>  
ServerName host2.ddns.net
</VirtualHost>
Alan
fonte