Я пытаюсь настроить Apache для размещения нескольких сайтов django через mod_wsgi. В руководстве по настройке mod_wsgi приведен пример конфигурации для этого сценария, где каждое приложение находится в одном каталоге:
WSGIScriptAliasMatch ^/([^/]+) /usr/local/django/$1/apache/django.wsgi
<DirectoryMatch ^/usr/local/django/([^/]+)/apache>
Order deny,allow
Allow from all
</DirectoryMatch>
Я пытаюсь расширить этот пример, добавив файл паролей, созданный для каждого приложения, использующего HTTP-аутентификацию. Я решил, что могу сделать это, настроив отдельный параллельный каталог для каждого приложения и сославшись на соответствующее имя каталога так, как это делается в WSGIScriptAliasMatch, например:
WSGIScriptAliasMatch ^/([^/]+) /usr/local/django/$1/apache/django.wsgi
<DirectoryMatch ^/usr/local/django/([^/]+)/apache>
AuthType Basic
AuthUserFile /usr/local/django-auth/$1/users.passwd
AuthGroupFile /dev/null
Require valid-user
</DirectoryMatch>
Я предполагал, что «$ 1» будет расширяться до параметров, соответствующих регулярному выражению для DirectoryMatch, однако я не могу пройти аутентификацию, и в моем журнале ошибок указано:
No such file or directory: Could not open password file: /usr/local/django-auth/$1/users.passwd
Таким образом, похоже, что «1 доллар» не расходуется на соответствующее приложение, как я предполагал. Есть ли способ добиться этого? Я не хочу добавлять новую директиву для каждого сайта, когда он появляется.
Обратите внимание, что для директивы DirectoryMatch вы в любом случае не можете использовать неименованные обратные ссылки:
https://httpd.apache.org/docs/2.4/mod/core.html#directorymatch
Начиная с версии 2.4.8, именованные группы и обратные ссылки захватываются и записываются в среду с соответствующим именем с префиксом «MATCH_» и в верхнем регистре. Это позволяет ссылаться на элементы путей из выражений и модулей, таких как mod_rewrite. Во избежание путаницы пронумерованные (безымянные) обратные ссылки игнорируются. Вместо этого используйте именованные группы.
<DirectoryMatch "^/var/www/combined/(?<sitename>[^/]+)"> Require ldap-group cn=%{env:MATCH_SITENAME},ou=combined,o=Example </DirectoryMatch>
... и совсем нет, для 2.2 (как тег вопроса)
https://httpd.apache.org/docs/2.2/mod/core.html#directorymatch
Директива
Описание: заключить директивы, которые применяются к каталогам файловой системы, соответствующим регулярному выражению, и их подкаталогам.
Syntax: <DirectoryMatch regex> ... </DirectoryMatch>
Контекст: конфигурация сервера, виртуальный хост
Статус: Core
Модуль: ядро
<DirectoryMatch> and </DirectoryMatch> are used to enclose a group of directives which will apply only to the named directory and sub-directories of that directory (and the files within), the same as <Directory>. However, it takes as an argument a regular expression. For example:
будет соответствовать каталогам в / www /, состоящим из трех чисел.
Символ конца строки Символ конца строки ($) не может соответствовать этой директиве.
Смотрите также
<Directory> for a description of how regular expressions are mixed in with normal <Directory>s How <Directory>, <Location> and <Files> sections work for an explanation of how these different sections are combined when a request is received
Путь AuthUserFile статичен, и его нельзя расширить на основе URL-адреса.
Возможно, вам стоит вместо этого посмотреть:
http://code.google.com/p/modwsgi/wiki/AccessControlMechanisms
Это позволит вам предоставить собственного поставщика аутентификации. Он может просматривать информацию о запросе в словаре «окружения», переданном в вашу функцию check_password (), и на основе этого проверять пользователя на соответствие конкретной базе данных пользователей.