配置 Apache 以使用 WSGI 处理子路径

Tom*_*rle 3 apache-2.2

我正在尝试设置 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
Run Code Online (Sandbox Code Playgroud)

如何告诉 Apache 通过 WSGI 脚本将请求路由到 /media/attachments 并直接为 /media 的其余部分提供服务?

Gra*_*ton 6

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
Run Code Online (Sandbox Code Playgroud)

并删除:

WSGIScriptAlias /media/attachments /var/www/vhosts/domain.com/subdomains/project/httpdocs/web/apache/django.wsgi
Run Code Online (Sandbox Code Playgroud)

这应该意味着只有那些子目录中的静态文件才会匹配 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>
Run Code Online (Sandbox Code Playgroud)

因为单独使用 Alias 指令,所以所有评估都在相同的优先级。您只需要确保更深层嵌套的 URL 先出现。

我们不使用 WSGIScriptAlias,而是使用 AddHandler 将 .wsgi 文件映射为 WSGI 脚本文件,并设置 ExecCGI 选项,以便 mod_wsgi 将允许它用作 WSGI 脚本文件。

我们设置 WSGIApplicationGroup 只是为了确保在每个进程中只创建一个 Django 实例。%{GLOBAL} 的值使它使用主要的 Python 解释器。

因此,根据您的喜好,有两种选择。

  • 对我来说最重要的信息是“别名指令优先于 WSGIScriptAlias”。这允许在同一 url 空间中非常灵活地混合静态文件和 Django 应用程序。 (2认同)