La configuración genérica masiva de vhost genera un código de estado 404 en cada solicitud de vhost

La configuración genérica masiva de vhost genera un código de estado 404 en cada solicitud de vhost

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.0a 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 RewriteRuleen 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 .htaccesscosas. 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 -ty apachectl -Sdice 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.coma 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.coma/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

información relacionada