2009-03-20 11 views
5

OK. Soy más o menos un novato HTTPD apache, así que por favor desnudo conmigo.Permita que Apache sirva múltiples directorios a través del único <Location>

Tengo un problema con la prestación de una gran cantidad de VirtualHosts y me preguntaba si existe una forma más eficiente de hacer las cosas.

Actualmente estoy usando la directiva de ubicación para servir una gran cantidad de proyectos de diferentes departamentos, más de 300 proyectos de 19 departamentos en total. Las estructuras son las mismas para todas las directivas de Ubicación, excepto para los directorios desde los que se sirven los archivos. Actualmente lo que tengo es un archivo de gran tamaño que se ve algo como esto:

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

Como se puede ver todas estas estructuras son los mismos a excepción de los caminos. Lo que me gustaría es, por supuesto, algo en lo que pueda usar variables para el departamento y los nombres de proyectos y simplemente mantener una única directiva de ubicación. Supongo que esto también es menos pesado en el servidor y la memoria.

Cualquier ayuda es muy apreciada.

Respuesta

1

No conozco ninguna forma de hacerlo específicamente, ya que no creo que AuthUserFile acepte un argumento dinámico. Puede ser más fácil escribir un pequeño script en el idioma de su elección que tome una plantilla para el bloque <Location> y lo repita para cada directorio que desee proteger. Ejemplo, en 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>' 

Para cada línea de la forma 'departmentA/Project1' se lee en la entrada estándar, imprime la sección <Location> correspondiente.

+0

Hola. Entiendo lo que dices. Sin embargo, lo que no entiendo es cómo integrar esto. ¿Quiere decir que Apache puede llamar esto en tiempo real o quiere decir que tengo que generar cada ubicación por adelantado? – Luke

+0

No, Apache no puede hacer esto automáticamente. Debe ejecutarlo para regenerar la configuración de Apache cada vez que desee cambiar el conjunto de ubicaciones protegidas (y luego deberá volver a cargar Apache). No pensé que no fuera el tipo de cosas que tendrías que hacer con frecuencia. –

3

¿Has probado el <LocationMatch> directive?

Toma una expresión regular en lugar de una ruta. Dependiendo de sus rutas y sus subopciones asociadas, es posible que pueda reducir los cientos de directivas hasta un puñado más manejable de ellas.

+0

¿Pero LocationMatch podría pasar esas variables a AuthUserFile? Y si es así, ¿cómo? – Luke

Cuestiones relacionadas