2009-03-20 12 views
5

OK. Ich bin so ziemlich ein Apache HTTPD noob also bitte mit mir.Lassen Sie Apache mehrere Verzeichnisse durch einzelne <Location>

Ich habe ein Problem mit einer großen Menge von VirtualHosts und ich fragte mich, ob es eine effizientere Art und Weise Dinge zu tun ist.

Ich verwende derzeit die Location-Anweisung, um eine große Menge Projekte aus verschiedenen Abteilungen, über 300 Projekte aus insgesamt 19 Abteilungen zu bedienen. Die Strukturen sind für jede Location-Anweisung identisch, außer für die Verzeichnisse, aus denen die Dateien bereitgestellt werden. Was ich zur Zeit haben, ist eine große Datei, die etwa wie folgt aussieht:

<VirtualHost *> 
    ServerName www.myserver.com 

    <Location /departmentA/project1> 
     AuthType Basic 
     AuthName "By Invitation Only" 
     AuthUserFile /usr/local/departmentA/project1/passwords 
     Require valid-user 
    </Location> 

    <Location /departmentA/project2> 
     AuthType Basic 
     AuthName "By Invitation Only" 
     AuthUserFile /usr/local/departmentA/project2/passwords 
     Require valid-user 
    </Location> 

    <Location /departmentB/project1> 
     AuthType Basic 
     AuthName "By Invitation Only" 
     AuthUserFile /usr/local/departmentA/project1/passwords 
     Require valid-user 
    </Location> 
</VirtualHost> 

Wie Sie alle diese Strukturen sind die gleichen, außer für die Pfade sehen. Was ich möchte, ist natürlich etwas, wo ich Variablen für die Abteilung und Projektnamen verwenden kann und nur eine einzige Direktive beibehalten kann. Ich gehe davon aus, dass dies auf Server und Speicher weniger schwer ist.

Jede Hilfe wird sehr geschätzt.

Antwort

1

Ich weiß keine Möglichkeit, das speziell zu tun, wie ich denke, AuthUserFile akzeptiert ein dynamisches Argument. Es könnte am einfachsten sein, ein kleines Skript in Ihrer bevorzugten Sprache zu schreiben, das eine Vorlage für den <Location>-Block erstellt und für jedes Verzeichnis, das Sie schützen möchten, wiederholt. Beispiel in Python:

#!/usr/bin/python 
import sys 
print '<VirtualHost *:80>' 
print ' ServerName www.myserver.com' 
for path in sys.stdin: 
    print ' <Location /%s>' % path.strip() 
    print '  AuthType Basic' 
    print '  AuthName "By Invitation Only"' 
    print '  AuthUserFile /usr/local/%s/passwords' % path.strip() 
    print '  Require valid-user' 
    print ' </Location>' 
print '</VirtualHost>' 

für jede Zeile der Form 'departmentA/project1' auf der Standardeingabe liest, druckt er den entsprechenden <Location> Abschnitt aus.

+0

Hallo. Ich verstehe was du sagst. Was ich jedoch nicht verstehe, ist, wie man das integriert. Meinst du, dass Apache das in Echtzeit anrufen kann oder meinst du, dass ich jeden Ort im Voraus generieren muss? – Luke

+0

Nein, Apache kann dies nicht automatisch tun. Sie müssen es ausführen, um die Apache-Konfiguration jedes Mal neu zu generieren, wenn Sie die Gruppe der geschützten Speicherorte ändern möchten (und dann müssen Sie Apache neu laden). Ich dachte nicht, dass es nicht die Art von Sache wäre, die man häufig machen müsste. –

3

Haben Sie versucht, die <LocationMatch> directive?

Es braucht einen regulären Ausdruck anstelle eines Pfades. Abhängig von Ihren Pfaden und den zugehörigen Unteroptionen können Sie möglicherweise die Anzahl der hunderten von Direktiven auf eine handlichere Handvoll reduzieren.

+0

Aber konnte LocationMatch diese Variablen an AuthUserFile übergeben? Und wenn ja, wie? – Luke

Verwandte Themen