generische massive vhost-Konfiguration verursacht 404-Statuscode bei jeder vhost-Anforderung

generische massive vhost-Konfiguration verursacht 404-Statuscode bei jeder vhost-Anforderung

Ich versuche, mit ServerAlias ​​einen Apache 2.4-Server mit zahlreichen Subdomains einzurichten. Die Grundkonfiguration für die Hauptdomain funktioniert einwandfrei (Hauptdomain => 200, alle Subdomains => 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>

Aber wenn ich die Zeilen für mein generisches Vhost-Setup hinzufüge, gibt der Webserver bei jeder Vhost-Anforderung (Subdomain) einen 404-Statuscode zurück:

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>

Ich denke, es muss etwas mit dem richtigen Ordnerpfad zu tun haben. Der Ordnerpfad sieht immer so aus:

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

Was ich brauche, ist einfach eine Konfiguration, die der Hauptdomäne und den damit verbundenen generischen Subdomänen entspricht. Also,

www.example.com
example.com

entspricht dem Ordnerpfad:

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

Und

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

sollte mit dem Ordnerpfad wie folgt übereinstimmen:

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

Aus irgendeinem seltsamen Grund funktioniert es auch, wenn ich es %0.0in den Subdomain-Pfad ändere, die Subdomains funktionieren, die Hauptdomain jedoch nicht. Wenn ich das also verwende, ist es umgekehrt. Hauptdomain => 404, alle Subdomains => 200.

Die Erklärung zu den magischen Zeichenfolgenliteralen für Ordnernamen habe ich in den Apache 2.4-Dokumenten gefunden:http://httpd.apache.org/docs/2.4/mod/mod_vhost_alias.html Aber anstatt mein Problem zu lösen, verwirrt es mich immer mehr ...

Der Webserver läuft unter openSUSE 42.2 minimal. Wie Sie vielleicht bereits vorgeschlagen haben, wurde der tatsächliche Domänenname hier in geändert example.com. Jede Hilfe zu diesem Problem wäre willkommen.

Edit: Wie ich auch weiter unten in meinem Kommentar zur ersten Antwort sagte, brauche ich eine Lösung, die nicht unbedingt irgendwelche RewriteRulein der vhost-Konfiguration erfordert. Da ich PHP-Systeme verwende, die ihre eigenen (manchmal wirklich komplexen) s haben RewriteRule, möchte ich mit diesem .htaccessZeug keinen Ärger bekommen. Aber jede andere Option außer cgiist möglich. Und ja, Symlink-Unterstützung ist aktiviert (oder kann aktiviert werden).


Bearbeiten:

Das Symlink-Beispiel hat mir geholfen, die Grundidee zu verstehen. Ein bisschen Nachdenken brachte mich zu der folgenden Lösung. Es gilt immer die Regel „Wer zuerst findet“, also hat es für mich funktioniert:

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 -tund apachectl -Ssagt, dass das ok ist. Getestet und hat funktioniert! :-)

Antwort1

Versuchen

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

Dies umfasst natürlich nicht die gesamte Konfiguration, sollte Ihre Wildcard-Subdomänen aber zum Laufen bringen.

Als nächstes würde ich alle Anfragen an umleiten www.example.com. example.comDer einfachste Weg, dies zu tun, ist wahrscheinlich mit einer htaccess-Datei darin/var/www/vhosts/example.com/www.example.com

Alternativ können Sie, wenn Sie Symlinks aktiviert haben, einen Symlink /var/www/vhosts/example.com/www.example.comzu/var/www/vhosts/example.com/httpdocs

Bearbeiten:

Sie können die Umleitung auch in der Vhost-Konfiguration einrichten, wenn Sie dies nicht tun möchten .htaccess. Versuchen Sie Folgendes:

<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>

Mir ist keine Möglichkeit bekannt, dies ohne eine Umleitung irgendeiner Art zu tun. Nebenbei bemerkt ist es eine gute Praxis, Nicht-www auf www oder www auf Nicht-www umzuleiten. Wenn Sie im Wesentlichen ein Duplikat Ihrer Site haben, ist dies ein Nachteil, wenn Sie SEO-Arbeit planen.

Antwort2

Ich habe mir ein Skript geschrieben – das funktioniert für mich :)

Aber bevor Sie mein Skript lesen, mein Tipp an Sie: Verwenden Sie nicht

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

Verwenden Sie stattdessen entweder: <VirtualHost *:80>oder <VirtualHost *>um Ihren VirtualHost-Eintrag zu beginnen.

Hinweis: Ich arbeite hauptsächlich unter AIX, daher verwende ich ksh als Shell. Dies sollte auch mit /bin/sh oder /bin/bash funktionieren.

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

verwandte Informationen