Позвольте Apache обслуживать несколько каталогов через один <Location>.

StackOverflow https://stackoverflow.com/questions/668150

  •  21-08-2019
  •  | 
  •  

Вопрос

У меня проблема с обслуживанием большого количества виртуальных хостов, и мне интересно, есть ли более эффективный способ сделать что-то.

В настоящее время я использую директиву Location для обслуживания большого количества проектов из разных отделов, всего более 300 проектов из 19 отделов.Структуры одинаковы для каждой директивы Location, за исключением каталогов, из которых обслуживаются файлы.Сейчас у меня есть большой файл, который выглядит примерно так:

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

Как видите, все эти структуры одинаковы, за исключением путей.Конечно, мне хотелось бы использовать переменные для названий отделов и проектов и просто поддерживать одну директиву Location.Я предполагаю, что это также снижает нагрузку на сервер и память.

<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>
Это было полезно?

Решение

Я не знаю, как это сделать конкретно, так как не думаю, что AuthUserFile принимает динамический аргумент.Возможно, проще всего написать небольшой сценарий на выбранном вами языке, который будет использовать шаблон для <Location> блокировать и повторяет его для каждого каталога, который вы хотите защитить.Пример в 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>'

Для каждой строки формы «departmentA/project1», считываемой со стандартного ввода, выводится соответствующий <Location> раздел.

Другие советы

Вы пробовали Директива <LocationMatch>?

Вместо пути требуется регулярное выражение.В зависимости от ваших путей и связанных с ними подопций вы можете сократить сотни директив до нескольких более управляемых.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top