2009-02-15 5 views
14

Mit Apache2 auf einem Linux-System gibt es eine Möglichkeit, mehrere VirtualDocumentRoot mit mod_vhost_alias?Apache Mehrere VirtualDocumentRoot

Dies ist Namenskonvention ich bin derzeit mit und verwenden möchten, um fortzufahren:

host     directory 
127.0.0.1 domain  domain.com 
127.0.0.1 sub.domain domain.com_sub 

Da ist in meinem vhosts Abschnitt der httpd.conf ich habe:

NameVirtualHost 127.0.0.1 

<VirtualHost 127.0.0.1> 
    VirtualDocumentRoot /var/www/%0.0.com 
</VirtualHost> 

<VirtualHost 127.0.0.1> 
    VirtualDocumentRoot /var/www/%2.0.com_%1 
</VirtualHost> 

Das Problem mit das ist, wenn ich sub.domain besuche, zeigt das Apache-Fehlerprotokoll, dass es nach /var/www/sub.domain.com sucht und nicht nach /var/www/domain.com_test, was mich zu der Annahme verleitet, dass es nur die erste Regel liest und scheitert dann, aber was ich möchte, ist, irgendein Dokumentenwurzel zu verwenden, das beides erfüllt der zwei VirtualDocumentRoot-Regeln.

+4

Ich nehme an, Sie dieses Problem gelöst, aber ich habe unten geschrieben für Vollständigkeit, da dies bei Google-Suchen auftaucht. Sie möchten diese Frage möglicherweise als beantwortet markieren? – starmonkey

Antwort

13

Apache wählt in der Regel den ersten virtuellen Host aus, dessen ServerName oder ServerAlias mit dem im HTTP-Header Host angegebenen Hostnamen übereinstimmt. In Ihrem Fall, da Sie keine ServerName Direktiven haben, verwendet Apache angeblich eine umgekehrte DNS-Suche auf der IP-Adresse, um einen Servernamen zu fälschen, und vorausgesetzt, dass das Reverse-DNS zu domain.com führt, was nicht übereinstimmt, Apache dann standardmäßig der erste virtuelle Host Klingt kompliziert, ich weiß ... die Quintessenz ist, sollten Sie ServerName und ServerAlias verwenden, um die Konfiguration explizit zu machen. Versuchen Sie, etwas mehr wie folgen aus:

NameVirtualHost 127.0.0.1 
<VirtualHost 127.0.0.1> 
    ServerName domain.com 
    ServerAlias www.domain.com 
    VirtualDocumentRoot /var/www/%0 
</VirtualHost> 
<VirtualHost 127.0.0.1> 
    ServerName sub.domain.com 
    ServerAlias *.domain.com 
    VirtualDocumentRoot /var/www/%2.%3_%1 
</VirtualHost> 

Die /var/www/domain.com für http://domain.com und /var/www/www.domain.com für http://www.domain.com verwenden soll, die beide von der ersten vhost serviert werden, und /var/www/sub.domain.com für http://sub.domain.com, /var/www/blah.domain.com für http://blah.domain.com, und so weiter.

+0

Das hat meinen Tag gerettet. Ich wechselte zwischen zwei VirtualHost-Dateien mit VirtualDocumentRoot-Definitionen. Ich wusste, dass es einen besseren Weg geben musste und du hast es herausgefunden. Vielen Dank! –

+0

Die Lösung löste mein Problem. Aber ich habe eine neue Frage, für einige spezielle Subdomains muss ich eine spezielle Konfiguration machen, wie zB JK config hinzufügen, oder eine angepasste Log-Datei einstellen. Wie können wir das machen? – Stony

+0

@Stony Ich schlage vor, auf [webmasters.SE] oder vielleicht [SF] zu fragen. –

2

In Bezug auf die OP und die Frage mit „/ var/www/html "wird gesetzt:

Das Problem, das ich hatte, war% 1 anstelle von% 2 zu verwenden. Hier ist mein Arbeitsbeispiel:

ServerAlias www.*.org.au 
UseCanonicalName Off 
VirtualDocumentRoot /path/to/sites/%2/pub 

Hoffnung, dass jemand hilft!

Ich lese die Dokumente auf "Directory Name Interpolation" in mod_vhost_alias docs.

4

Sie müssen die Rückwärtsreferenzen qualifizieren, wenn Sie ein '.' im Dateipfad. Also müssen Sie es so haben:

VirtualDocumentRoot /var/www/%2.0.%3_%1 
0

Ich fand schließlich eine Konfiguration, die flexible Subdomain-Erstellung ermöglicht.

Siehe Apache-Dokumentation auf mod_vhost_alias

Wenn Ihre Root-dev Domäne 3 Teile wie dev.example hat.com können Sie %-4+ als Platzhalter für alles vor der Stammdomäne verwenden. Wenn es 4 Teile hat, verwenden Sie %-5+.

<VirtualHost *:80> 
    VirtualDocumentRoot "/var/www/%-4+/webroot" 
    ServerName www.dev.example.com 
    ServerAlias *.dev.example.com 
    php_admin_value auto_prepend_file /var/www/setdocroot.php 
</VirtualHost> 

Auf diese Weise können Sie ein Verzeichnis mit dem Namen /var/www/sub.domain/webroot und Zugriff auf sie mit der sub.domain.dev.example.com URL erstellen.

Die Linie php_admin_value auto_prepend_file /var/www/setdocroot.php die docroot auf manchen Systemen wie OSX 10.9+

Hier fixiert ist der Gehalt an setdocroot.php:

<?php 
$_SERVER['DOCUMENT_ROOT'] = str_replace($_SERVER['SCRIPT_NAME'], '', $_SERVER['SCRIPT_FILENAME']); 
?> 
Verwandte Themen