Laissez Apache servir plusieurs répertoires par simple
-
21-08-2019 - |
Question
J'ai un problème de servir une grande quantité de VirtualHosts et je me demandais s'il y a un moyen plus efficace de faire les choses.
J'utilise actuellement la directive Lieu de servir un grand projets de quantité de différents départements, plus de 300 projets de 19 départements au total. Les structures sont les mêmes pour chaque directive Location, sauf pour les répertoires des fichiers sont servis à partir. Ce que j'ai actuellement un grand fichier qui ressemble à ceci:
<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>
Comme vous pouvez voir toutes ces structures sont les mêmes, sauf pour les chemins. Ce que je voudrais est bien sûr quelque chose où je peux utiliser des variables pour le département et les projets et maintenir une seule directive Location. Je suppose que cela est également moins lourd sur le serveur et la mémoire.
<VirtualHost *>
ServerName www.myserver.com
<Location /$1/$2>
AuthType Basic
AuthName "By Invitation Only"
AuthUserFile /usr/local/$1/$2/passwords
Require valid-user
</Location>
</VirtualHost>
La solution
Je ne connais aucune façon de le faire précisément, comme je ne pense pas que accepte un argument AuthUserFile
dynamique. Il est peut-être plus facile d'écrire un petit script dans votre langue de choix qui prend un modèle pour le bloc et répète <Location>
pour chaque répertoire que vous voulez protéger. Exemple, dans le 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>'
Pour chaque ligne du formulaire « departmentA / project1 » il lit sur l'entrée standard, il imprime la section correspondante <=>.
Autres conseils
Avez-vous essayé
Il faut une expression régulière au lieu d'un chemin. En fonction de vos chemins et leurs sous-options associées, vous pourriez être en mesure de réduire les centaines de directives à une poignée plus facile à gérer d'entre eux.