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