我正在尝试设置 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 的其余部分提供服务?
Alias 指令优先于 WSGIScriptAlias,因此您不能在 Alias 指令指定的 URL 下挂载 WSGI 应用程序。
由于多个 WSGIScriptAlias 指令,除非您使用 WSGIApplicationGroup 指令强制将它们委托给进程中的同一个 Python 子解释器,否则在每个进程中启动多个 Django 实例时,您也会遇到问题.
至于解决方案,由于您使用的布局,做您想做的事情有点棘手。我有一个想法,但需要先测试一下。
更新 1
第一种可能性是,如果您在 Django 使用的“css”、“img”和“js”的传统子目录中拥有所有内容,而不是上面的 Alias 指令,请使用:
并删除:
这应该意味着只有这些子目录中的静态文件才会匹配 Alias 指令并直接提供服务。
更新 2
我必须测试的另一个选项是不使用 WSGIScriptAlias,而是对所有内容使用 Alias 指令。这将像这样完成:
因为单独使用 Alias 指令,所以都以相同的优先级进行评估。您只需要确保嵌套更深的 URL 先出现。
我们使用 AddHandler 将 .wsgi 文件映射为 WSGI 脚本文件,而不是 WSGIScriptAlias,并设置 ExecCGI 选项,以便 mod_wsgi 允许将其用作 WSGI 脚本文件。
我们设置 WSGIApplicationGroup 只是为了确保在每个进程中只创建一个 Django 实例。%{GLOBAL} 的值使它使用主要的 Python 解释器。
所以,两种选择取决于你的喜好。