我正在尝试将 Apache 配置为通过 mod_wsgi 托管多个 django 站点。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' 并没有像我想象的那样被用于匹配的应用程序。有没有办法做到这一点?我不想在每个站点弹出时都为其添加新指令。
AuthUserFile 路径是静态的,无法根据 URL 进行扩展。
你也许应该看看:
http://code.google.com/p/modwsgi/wiki/AccessControlMechanisms
这将允许您提供自己的身份验证提供程序。这可以查看传递给您的 check_password() 函数的“环境”字典中的请求信息,并根据该信息根据特定用户数据库验证用户。
请注意,对于 DirectoryMatch 指令,无论如何您都不能使用未命名的反向引用:
https://httpd.apache.org/docs/2.4/mod/core.html#directorymatch
...根本不是,对于 2.2 (因为问题的标签是)
https://httpd.apache.org/docs/2.2/mod/core.html#directorymatch