Manipulação de site não encontrado e página não encontrada com hospedagem virtual de massa dinâmica

2

Recentemente, configurei hospedagem virtual em massa no Apache para que tudo o que precisamos fazer seja crie um diretório para criar um novo vhost. Então, também estamos usando o DNS curinga para mapear todos os subdomínios para o servidor que está executando nossa instância do Apache.

Isso funciona de maneira excelente, mas agora estou com problemas para configurá-lo para failover em uma página de erro / padrão apropriada quando o diretório vhost não existe.

O problema parece estar confundido pelo meu desejo de lidar com as duas condições de erro:

  1. vhost não encontrado, ou seja, não foi encontrado nenhum diretório correspondente ao host fornecido no cabeçalho do host HTTP. Gostaria que isso exibisse uma página de erro de site não encontrada apropriada.
  2. A condição 404 não encontrada do vhost.

Além disso, tenho um vhost "api" especializado em seu próprio bloco vhost.

Eu tentei várias variações e nenhuma delas parece exibir o comportamento que eu quero. Aqui está o que estou trabalhando agora:

NameVirtualHost *:80
<VirtualHost *:80>
    DocumentRoot /var/www/site-not-found
    ServerName sitenotfound.mydomain.org

    ErrorDocument 500 /500.html
    ErrorDocument 404 /500.html
</VirtualHost>

<VirtualHost *:80>
    ServerName api.mydomain.org
    DocumentRoot /var/www/vhosts/api.mydomain.org/current
    # other directives, e.g. setting up passenger/rails etc...
</VirtualHost>

<VirtualHost *:80>
    # get the server name from the Host: header
    UseCanonicalName Off
    VirtualDocumentRoot /var/www/vhosts/%0/current
    # other directives ... e.g proxy passing to api etc...
    ErrorDocument 404 /404.html
</VirtualHost>

Meu entendimento é que o primeiro bloco vhost é usado como padrão, então eu tenho isso aqui como meu site catch all. Em seguida, tenho meu vhost de API e, finalmente, meu bloco vhost de massa.

Portanto, para um domínio que não corresponda aos dois primeiros nomes de servidor e não tenha um diretório correspondente em /var/www/vhosts/ , esperaria que ele fosse transferido para o primeiro vhost, mas, com essa configuração, todos os domínios serão resolvidos como padrão site não encontrado. Por que isso acontece?

Colocando o bloco mass-vhost primeiro, posso fazer com que o mass-vhosts seja resolvido corretamente, mas não o meu vhost não encontrado no site ... e neste caso não consigo encontrar uma maneira de distinguir entre um 404 de nível de página no vhost e o caso em que o VirtualDocumentRoot não consegue encontrar um diretório vhost (isso também parece usar o 404).

Qualquer ajuda desta ligação é muito apreciada!

    
por Rick Moynihan 31.08.2012 / 17:28

1 resposta

1

I'd expect it to fall-over to the first vhost, however with this setup, all domains resolve to my default site-not-found. Why is this?

Não há lógica de failover entre hosts virtuais diferentes - uma vez que uma solicitação é atribuída a uma, ela é final.

Quando você não tem ServerName ou ServerAlias em seu bloco vhost dinâmico, você está dependendo do comportamento "primeiro vhost para carregar é o padrão" para atribuir solicitações a esse vhost. Quando não é o primeiro vhost a carregar, é essencialmente inerte; não há como conseguir um pedido.

Minha recomendação sobre como lidar com isso é ter o comportamento "site não encontrado" como proxy ou redirecionado para um site de trabalho (que, por sua vez, exibe uma página "sem conteúdo aqui!"), em vez de uma variante da sua página 404.

Mova o sitenotfound.mydomain.org vhost para baixo e obtenha o dinâmico novamente no topo para que seja o padrão. Nós vamos usá-lo para servir a nossa página amigável "no site here".

Então, vamos dar ao vhost dinâmico a capacidade de verificar se um site existe antes de exibir o conteúdo dele. Adicione dentro de seu vhost:

RewriteEngine On
# If there's no directory where it should be for this host..
RewriteCond /var/www/vhosts/%{HTTP_HOST} !-d
# (or a symlink, we'll be ok with those too)
RewriteCond /var/www/vhosts/%{HTTP_HOST} !-l

# Then, we'll redirect the user to our friendly "no site here" page..
# Note that I'm setting it to 302 so that they won't be cached, since
# you might trigger this accidentally just before a new site goes live..
RewriteRule ^ http://sitenotfound.mydomain.org/invalid-site.html [R=302,L]

# Or if you wanted to proxy instead of redirecting, use this instead:
#RewriteRule ^ http://sitenotfound.mydomain.org/invalid-site.html [P,L]

Portanto, o host dinâmico agora verificará a existência do diretório do site antes de veicular o conteúdo dele e redirecionará ou encaminhará o usuário para uma página de explicação amigável. Esse comportamento parece que vai atender às suas necessidades?

    
por 31.08.2012 / 23:09