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

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

我正在尝试配置 Apache 来托管 Django web 服务和 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>
...

这会将每个请求定向到正确的处理程序。但是,我的 Djangourls.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')),
...

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

有什么方法可以将完整的 URL 传递给 Django?

解决方案

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

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

WSGIScriptAlias /api /var/www/mysite.com/apache/django.wsgi/api

/api当 ie 到达 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>
...

答案1

您所看到的正是它通常的工作方式。WSGI 应用程序不应关心或嵌入有关其安装位置的信息。换句话说,您不应该在 urls.py 中使用“api”作为前缀。您为什么认为需要在 urls.py 中使用“api”前缀?


更新 1

您可能能够使用:

WSGIScriptAlias /api /var/www/mysite.com/apache/django.wsgi/api

我现在不记得确切的公式是什么,也记不清是否正确,但请尝试一下。

相关内容