我正在尝试设置 Apache、Django 和mod_xsendfile允许我使用 Django 身份验证控制对某些文件的访问,同时仍然使用 Apache 发送实际文件数据。
我对这个配置有疑问:
# Some files must be publicly available without the Django auth check.
# When I comment this out, public media is not accessible but the WSGI script for
# /media/attachment DOES get called.
# So I think I need to somehow exclude /media/attachment from the effect of this Alias
Alias /media/ /var/www/vhosts/domain.com/subdomains/project/httpdocs/media/
# This <Location> block disables everything (Forbidden) regardless of the WSGI stuff
#
#<Location /media/attachments>
# Deny from all
#</Location>
WSGIScriptAlias / /var/www/vhosts/cdomain.com/subdomains/project/httpdocs/web/apache/django.wsgi
WSGIScriptAlias /media/attachments /var/www/vhosts/domain.com/subdomains/project/httpdocs/web/apache/django.wsgi
XSendFile On
我如何告诉 Apache 通过 WSGI 脚本将请求路由到 /media/attachments 并直接提供 /media 的其余部分?
答案1
Alias 指令优先于 WSGIScriptAlias,因此您无法在 Alias 指令指定的 URL 下挂载 WSGI 应用程序。
事实上,由于多个 WSGIScriptAlias 指令,您还会遇到在每个进程中启动多个 Django 实例的问题,除非您使用 WSGIApplicationGroup 指令强制将它们委托给进程内的同一个 Python 子解释器。
至于解决方案,由于您使用的布局,执行您想要的操作有点棘手。我有一个想法,但需要先测试一下。
更新 1
第一种可能性是,如果您的所有内容都位于 Django 使用的“css”、“img”和“js”的传统子目录中,则不要使用上面的 Alias 指令,而是使用:
AliasMatch ^/(css|img|js)(/.*)$ /var/www/vhosts/domain.com/subdomains/project/httpdocs/media/$1$2
并删除:
WSGIScriptAlias /media/attachments /var/www/vhosts/domain.com/subdomains/project/httpdocs/web/apache/django.wsgi
这意味着只有这些子目录中的静态文件才会与 Alias 指令匹配并直接提供服务。
更新2
我必须测试的另一个选项是不使用 WSGIScriptAlias,而是对所有内容使用 Alias 指令。这将像下面这样完成:
Alias /media/attachments/ /var/www/vhosts/domain.com/subdomains/project/httpdocs/web/apache/django.wsgi
Alias /media/ /usr/local/django/example/media/
Alias / /var/www/vhosts/domain.com/subdomains/project/httpdocs/web/apache/django.wsgi
<Directory /var/www/vhosts/domain.com/subdomains/project/httpdocs/web/apache>
WSGIApplicationGroup %{GLOBAL}
AddHandler wsgi-script .wsgi
Options ExecCGI
Order allow,deny
Allow from all
</Directory>
因为仅使用 Alias 指令,所以所有指令都按相同的优先级进行评估。您只需要确保更深层次嵌套的 URL 优先。
我们使用 AddHandler 而不是 WSGIScriptAlias 将 .wsgi 文件映射为 WSGI 脚本文件,并设置 ExecCGI 选项,以便 mod_wsgi 允许将其用作 WSGI 脚本文件。
我们设置 WSGIApplicationGroup 只是为了确保每个进程中只创建一个 Django 实例。%{GLOBAL} 的值使其使用主 Python 解释器。
因此,有两种选择,具体取决于您的喜好。