我可以配置 apache/mod_wsgi 以便别名 URL 路径在到达我的 Django 应用程序之前不会被剥离吗?

Dav*_*ull 2 django mod-wsgi apache-2.2

我正在尝试将 Apache 配置为托管 Django 网络服务和 PHP 网站。

具有该模式的所有 URLwww.mysite.com/api都应定向到 Django 服务。所有其他 URL(例如www.mysite.com)都应该指向 PHP 网站。

我的虚拟主机配置如下所示:

...
WSGIScriptAlias /api /var/www/mysite.com/apache/django.wsgi
<Directory /var/www/mysite.com/apache>
    Order allow,deny
    Allow from all
</Directory>

Alias / /var/www/mysite.com/apache/php/
<Directory /var/www/mysite.com/apache/php>
    Options Indexes FollowSymLinks
    AllowOverride All
    Order Deny,Allow
    Allow from all
</Directory>
...
Run Code Online (Sandbox Code Playgroud)

这会将每个请求定向到正确的处理程序。但是,我的 Django urls.py看起来像这样:

...
api_patterns = patterns('',
    url(r'^api/1.0/$', views.api_root),
    url(r'^api/1.0/oauth/', 
        include('oauth2_provider.urls', 
                namespace='oauth2_provider')),
...
Run Code Online (Sandbox Code Playgroud)

这无法匹配任何 URL,因为它期望它们以api. 当然,这个前缀在它到达这里之前被剥离(当请求到达这里时,它们是格式1.0/oauth等)。

有没有办法将完整的 URL 传递给 Django?

解决方案

mod_wsgi 的作者 Graham Dumpleton 提出了几种解决此问题的方法,这两种方法都有效(请参阅下面已接受的答案)。

我选择了他在 UPDATE 1 中建议的解决方案。附加/api到文件路径解决了这个问题:

WSGIScriptAlias /api /var/www/mysite.com/apache/django.wsgi/api
Run Code Online (Sandbox Code Playgroud)

ie/api在到达 Django 时不再从 URL 中剥离。

所以这里是我的工作配置的相关部分:

...
DocumentRoot /var/www/mysite.com/apache/php

WSGIScriptAlias /api /var/www/mysite.com/apache/service/django.wsgi/api
<Directory /var/www/mysite.com/apache/service>
    WSGIProcessGroup www.mysite.com
    WSGIPassAuthorization On
    Options -Indexes
    Order allow,deny
    Allow from all
</Directory>

# PHP web site
<Directory /var/www/mysite.com/apache/php>
    Options -Indexes FollowSymLinks
    AllowOverride All
    Order Deny,Allow
    Allow from all
    DirectoryIndex index.php
</Directory>
...
Run Code Online (Sandbox Code Playgroud)

Gra*_*ton 5

您所看到的正是它通常的工作方式。WSGI 应用程序不应该关心也不应该嵌入关于它被安装在哪里的知识。换句话说,您不应该在 urls.py 中使用“api”作为前缀。为什么您认为 urls.py 中需要“api”前缀?


更新 1

您或许可以使用:

WSGIScriptAlias /api /var/www/mysite.com/apache/django.wsgi/api
Run Code Online (Sandbox Code Playgroud)

我现在不记得确切的公式以及它是否正确,但请尝试一下。