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.0
o 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 RewriteRule
na configuração do vhost. Como estou usando sistemas php, que possuem seus próprios RewriteRule
sistemas (às vezes muito complexos), então não quero ter problemas com essas .htaccess
coisas. 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 -t
e apachectl -S
diz 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.com
para 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.com
para/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