Назад | Перейти на главную страницу

Ссылка на соответствующий каталог в директиве Apache DirectoryMatch

Я пытаюсь настроить 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 (), и на основе этого проверять пользователя на соответствие конкретной базе данных пользователей.