configuração massiva genérica de vhost causa código de status 404 em cada solicitação de vhost

configuração massiva genérica de vhost causa código de status 404 em cada solicitação de vhost

Estou tentando configurar um servidor Apache 2.4 com subdomínios enormes usando ServerAlias. A configuração básica do domínio principal funciona perfeitamente (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 adiciono as linhas para minha configuração genérica de vhost, o servidor 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>

Eu acho que deve ser necessário fazer algo com o caminho da pasta correto. O caminho da pasta sempre fica assim:

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

O que preciso é simplesmente de uma configuração que corresponda ao domínio principal e aos subdomínios genéricos associados a ele. 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 caminho da pasta assim:

/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 mudar para %0.0o caminho do subdomínio, os subdomínios funcionarão, mas o domínio principal não. Então, com o uso disso, é o contrário. Domínio principal => 404, todos os subdomínios => 200.

Encontrei a explicação para os literais de string mágica para nomes de pastas nos documentos do Apache 2.4:http://httpd.apache.org/docs/2.4/mod/mod_vhost_alias.html Mas em vez de resolver o meu problema, isso me confunde cada vez mais...

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

Editar: Como eu disse abaixo no meu comentário à primeira resposta, preciso de uma solução, que não exija necessariamente nenhuma RewriteRulena configuração do vhost. Como estou usando sistemas php, que possuem seus próprios RewriteRulesistemas (às vezes muito complexos), então não quero ter problemas com essas .htaccesscoisas. Mas quaisquer outras opções, exceto cgié possível. E sim, o suporte a links simbólicos está habilitado (ou é possível habilitá-lo).


Editar:

O exemplo do link simbólico me ajudou a ter uma ideia básica. Um pouco de repensar me levou a esta solução abaixo. A 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 -te apachectl -Sdiz que está tudo bem. Testado e funcionou! :-)

Responder1

Tentar

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

Obviamente, isso não inclui toda a configuração, mas deve fazer com que seus subdomínios curinga funcionem.

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

Alternativamente, se você tiver links simbólicos ativados, poderá criar um link simbólico /var/www/vhosts/example.com/www.example.compara/var/www/vhosts/example.com/httpdocs

Editar:

Você pode colocar o redirecionamento na configuração do vhost se não quiser fazê-lo no formato .htaccess. Experimente 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 conheço nenhuma maneira de fazer isso sem algum tipo de redirecionamento. Por outro lado, é uma boa prática redirecionar não-www para www ou www para não-www. Ter o que é essencialmente uma duplicata do seu site será um prejuízo se você planeja fazer algum trabalho de SEO.

Responder2

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

Mas antes de ler meu roteiro - 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 em AIX - então tenho ksh como shell. Isso também deve funcionar 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

informação relacionada