![我可以配置 apache/mod_wsgi 以便别名 URL 路径在到达我的 Django 应用程序之前不会被剥离吗?](https://linux22.com/image/621175/%E6%88%91%E5%8F%AF%E4%BB%A5%E9%85%8D%E7%BD%AE%20apache%2Fmod_wsgi%20%E4%BB%A5%E4%BE%BF%E5%88%AB%E5%90%8D%20URL%20%E8%B7%AF%E5%BE%84%E5%9C%A8%E5%88%B0%E8%BE%BE%E6%88%91%E7%9A%84%20Django%20%E5%BA%94%E7%94%A8%E7%A8%8B%E5%BA%8F%E4%B9%8B%E5%89%8D%E4%B8%8D%E4%BC%9A%E8%A2%AB%E5%89%A5%E7%A6%BB%E5%90%97%EF%BC%9F.png)
我正在尝试配置 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
我现在不记得确切的公式是什么,也记不清是否正确,但请尝试一下。