Estoy intentando configurar un servidor Apache 2.4 con subdominios masivos usando ServerAlias. La configuración básica para el dominio principal funciona bien (dominio principal => 200, todos los subdominios => 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>
Pero cuando agrego las líneas para mi configuración de vhost genérico, el servidor web devuelve un código de estado 404 en cada solicitud de vhost (subdominio):
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>
Creo que debe tener que ver con la ruta correcta de la carpeta. La ruta de la carpeta siempre se ve así:
/var/www/vhosts/maindomain.com/subdomain.maindomain.com
Lo que necesito es simplemente una configuración que coincida con el dominio principal y los subdominios genéricos asociados a él. Entonces,
www.example.com
example.com
coincide con la ruta de la carpeta:
/var/www/vhosts/example.com/httpdocs
Y
ci.example.com
tracker.example.com
other.example.com
debe coincidir con la ruta de su carpeta de esta manera:
/var/www/vhosts/example.com/ci.example.com
/var/www/vhosts/example.com/tracker.example.com
/var/www/vhosts/example.com/other.example.com
Además, por alguna extraña razón, si lo cambio %0.0
a la ruta del subdominio, los subdominios funcionan, pero el dominio principal no. Entonces, al usar eso, es al revés. Dominio principal => 404, todos los subdominios => 200.
Encontré la explicación para los literales de cadena mágica para los nombres de carpetas en los documentos de Apache 2.4:http://httpd.apache.org/docs/2.4/mod/mod_vhost_alias.html Pero en lugar de resolver mi problema, me confunde cada vez más...
El servidor web se ejecuta bajo openSUSE 42.2 mínimo. Como ya habrás sugerido, el nombre de dominio real se cambia aquí a example.com
. Cualquier ayuda con este problema sería genial.
Editar: Como dije también a continuación en mi comentario a la primera respuesta, necesito una solución, que no necesariamente requiere ninguna RewriteRule
en la configuración de vhost. Debido a que estoy usando sistemas php, que tienen sus propios (a veces muy complejos) RewriteRule
, no quiero tener problemas con esas .htaccess
cosas. Pero es posible cualquier otra opción, excepto cgi
. Y sí, la compatibilidad con enlaces simbólicos está habilitada (o es posible habilitarla).
Editar:
El ejemplo del enlace simbólico me ayudó a tener una idea básica. Un poco de replanteamiento me llevó a esta solución a continuación. La primera regla encontrada siempre se aplica, así que funcionó para mí:
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
y apachectl -S
dice que esto está bien. ¡Probado y trabajado! :-)
Respuesta1
Intentar
<VirtualHost *:80>
ServerName example.com
DocumentRoot /var/www/vhosts/example.com/httpdocs
ServerAlias *.example.com
VirtualDocumentRoot /var/www/vhosts/example.com/%0
</VirtualHost>
Obviamente, esto no incluye toda la configuración, pero debería hacer que sus subdominios comodín funcionen.
A continuación, redirigiría todas las solicitudes www.example.com
a example.com
. La forma más sencilla de hacerlo es probablemente con un archivo htaccess dentro/var/www/vhosts/example.com/www.example.com
Alternativamente, si tiene enlaces simbólicos activados, puede hacerlo /var/www/vhosts/example.com/www.example.com
a/var/www/vhosts/example.com/httpdocs
Editar:
Podrías poner la redirección en la configuración de vhost si no quieres hacerlo en .htaccess
. Prueba esto:
<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>
No conozco ninguna forma de hacerlo sin algún tipo de redireccionamiento. Como nota al margen, es una buena práctica redirigir sin www a www o www a sin www. Tener lo que es esencialmente un duplicado de su sitio será perjudicial si planea realizar algún trabajo de SEO.
Respuesta2
Escribí un guión para mí, eso funciona para mí :)
Pero antes de leer mi guión, mi sugerencia es que no uses
<VirtualHost example.com>
....
</VirtualHost>
en su lugar, utilice: <VirtualHost *:80>
o <VirtualHost *>
para comenzar la entrada de VirtualHost.
Nota: Trabajo principalmente en AIX, por lo que tengo ksh como shell. Esto debería funcionar también con /bin/sh o /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