configuração vhost massiva genérica causa código de status 404 em todas as requisições vhost

2

Estou tentando configurar um servidor apache 2.4 com subdomínios maciços usando o ServerAlias. A configuração básica do domínio principal funciona bem (domínio principal = > 200, todos os subdomínios = > 404):

UseCanonicalName Off

<VirtualHost example.com>
        ServerName example.com
        ServerAlias www.example.com
        VirtualDocumentRoot "/var/www/vhosts/example.com/httpdocs"
        DirectoryIndex index.php index.html

        <Directory />
                Options +Indexes +FollowSymLinks +Includes
                <IfModule !mod_access_compat.c>
                        Require all granted
                </IfModule>
                <IfModule mod_access_compat.c>
                        Order allow,deny
                        Allow from all
                </IfModule>
                AllowOverride All
        </Directory>
</VirtualHost>

Mas quando eu adiciono as linhas do meu vhost genérico configurado, o servidor da web retorna um código de status 404 em cada solicitação de vhost (subdomínio):

UseCanonicalName Off

<VirtualHost example.com>
        ServerName example.com
        ServerAlias www.example.com
        VirtualDocumentRoot "/var/www/vhosts/example.com/httpdocs"
        DirectoryIndex index.php index.html
        ServerAlias *.example.com
        VirtualDocumentRoot "/var/www/vhosts/example.com/%1.0"
        DirectoryIndex index.php index.html

        <Directory />
                Options +Indexes +FollowSymLinks +Includes
                <IfModule !mod_access_compat.c>
                        Require all granted
                </IfModule>
                <IfModule mod_access_compat.c>
                        Order allow,deny
                        Allow from all
                </IfModule>
                AllowOverride All
        </Directory>
</VirtualHost>

Acho que é necessário fazer algo com o caminho correto da pasta. O caminho da pasta sempre se parece com isto:

/var/www/vhosts/maindomain.com/subdomain.maindomain.com

O que eu preciso é simplesmente uma configuração que corresponda ao domínio principal e sub-domínios genéricos associados a isso. Então,

www.example.com
example.com

corresponde ao caminho da pasta:

/var/www/vhosts/example.com/httpdocs

e

ci.example.com
tracker.example.com
other.example.com

deve corresponder ao seu caminho de pasta como este:

/var/www/vhosts/example.com/ci.example.com
/var/www/vhosts/example.com/tracker.example.com
/var/www/vhosts/example.com/other.example.com

Além disso, por algum motivo estranho, se eu alterá-lo para %0.0 no caminho do subdomínio, os subdomínios funcionarão, mas o domínio principal não. Então, usando isso, é o contrário. Domínio principal = > 404, todos os subdomínios = > 200.

Eu encontrei a explicação para os literais mágicos para nomes de pastas nos documentos do apache 2.4: link Mas ao invés de resolver meu problema, isso me confunde mais e mais ...

O servidor da web é executado no mínimo do openSUSE 42.2. Como você já sugeriu, o nome do domínio real é alterado aqui para example.com . Qualquer ajuda para esse problema seria ótima.

Edit: Como eu disse também abaixo no meu comentário para a primeira resposta, eu preciso de uma solução, que não requer necessariamente qualquer RewriteRule na configuração vhost. Porque eu estou usando sistemas PHP, que têm o seu próprio (por vezes complexo real) RewriteRule s, então eu não quero entrar em apuros com esse material .htaccess . Mas quaisquer outras opções, exceto cgi , são possíveis. E sim, o suporte a links simbólicos está habilitado (ou possível para ativá-lo).

Editar:

O exemplo de link simbólico me ajudou a entender a ideia básica. Um pouco repensar trouxe-me a esta solução abaixo. Primeira regra encontrada sempre se aplica, então funcionou para mim:

UseCanonicalName Off
<VirtualHost *:80>
        DocumentRoot "/var/www/vhosts/example.com/httpdocs"
        ServerName www.example.com
        ServerAlias example.com
        <Directory />
                Options Indexes FollowSymLinks Includes ExecCGI
                AllowOverride All
                Require all granted
                Allow from all
        </Directory>
</VirtualHost>

<VirtualHost *:80>
        DocumentRoot "/var/www/vhosts/example.com/httpdocs"
        ServerName example.com
        ServerAlias *.example.com
        VirtualDocumentRoot "/var/www/vhosts/example.com/%1"
        <Directory />
                Options Indexes FollowSymLinks Includes ExecCGI
                AllowOverride All
                Require all granted
                Allow from all
        </Directory>
</VirtualHost>

apachectl -t e apachectl -S diz que está tudo bem. Testado e trabalhado! : -)

    
por alpham8 18.04.2017 / 00:22

2 respostas

2

Tente

<VirtualHost *:80>
    ServerName example.com
    DocumentRoot /var/www/vhosts/example.com/httpdocs
    ServerAlias *.example.com
    VirtualDocumentRoot /var/www/vhosts/example.com/%0
</VirtualHost>

Isso obviamente não inclui toda a configuração, mas deve fazer com que seus subdomínios de curingas funcionem.

Em seguida, redirecionaria todas as solicitações para www.example.com para example.com . A maneira mais fácil de fazer isso é provavelmente com um arquivo htaccess dentro de /var/www/vhosts/example.com/www.example.com

De forma inversa, se você tiver links simbólicos, poderá vincular /var/www/vhosts/example.com/www.example.com a /var/www/vhosts/example.com/httpdocs

Editar:

Você pode colocar o redirecionamento na configuração do vhost se não quiser fazer isso em .htaccess . Tente isto:

<VirtualHost *:80>
    ServerName example.com
    DocumentRoot /var/www/vhosts/example.com/httpdocs
    ServerAlias *.example.com
    VirtualDocumentRoot /var/www/vhosts/example.com/%0
    RewriteEngine on
    RewriteCond %{HTTP_HOST} ^www.example.com
    RewriteRule ^/(.*)$ http://example.com/$1 [L,R=301]
</VirtualHost>

Não estou ciente de nenhuma maneira de fazer isso sem um redirecionamento de algum tipo. Em uma nota lateral, é uma boa prática redirecionar o não-www para www ou www para não-www. Tendo o que é essencialmente uma duplicata do seu site será um detrimento se você planeja fazer qualquer trabalho de SEO.

    
por 25.04.2017 / 10:46
0

Eu escrevi um script para mim - isso funciona para mim:)

Mas antes de ler meu script - minha dica para você é não usar

<VirtualHost example.com>
....
</VirtualHost>

em vez disso, use: <VirtualHost *:80> ou <VirtualHost *> para iniciar sua entrada no VirtualHost.

Nota: Eu trabalho principalmente no AIX - então eu tenho o ksh como shell. Isso deve funcionar também com / bin / sh ou / bin / bash.

Syntax:
vhost.ksh <ServrName> [ServerAlias1] [... ServerAliasN]

#!/usr/bin/ksh
# Copyright AIXTOOLS.NET, 2014
# This script creates a vhost template
# under the assumption that the site might be served by multiple hosts
# the logs are put into a sub-directory
# ${SITEroot}/logs/LOGNAME.$host
site=$1
shift
alias=$*
HOST='hostname -s'
SITE=/var/httpd/${site}
LOGDIR=${SITE}/logs

cat -<<EOF1
# AIXTOOLS.NET vhost.ksh output
# VirtualHost template for ${site}
# SITEBASE=${SITE}
# LOGDIR=${LOGDIR}

<VirtualHost *:80>
     ServerName  ${site}
EOF1
for name in ${alias}
do
print "    ServerAlias  ${name}"
done

cat - <<EOF2

DocumentRoot "${SITE}/htdocs"

<Directory "/var/httpd/${site}/htdocs">
    Options Indexes FollowSymLinks Includes
    AllowOverride All
    Order allow,deny
    Allow from all
</Directory>

#Logs for ${site}
# combined is chosen as default to support awstats reporting
    CustomLog "${LOGDIR}/access_log.${HOST}" combined
#    ErrorLog "${LOGDIR}/error_log.${HOST}"
# You can consider using different "localN" syslogs to split different vhosts
# should you need that
    ErrorLog syslog:user
#    LogLevel alert rewrite:trace3
#    LogLevel alert
#    RewriteLog "/var/httpd/${site}/logs/rewrite.log"
#    RewriteLogLevel 0
</VirtualHost>
EOF2
    
por 28.04.2017 / 11:32