我想configurationApache来承载一个Django的web服务和一个PHP网站。
所有使用www.mysite.com/api模式的url都应该被定向到Django服务。 所有其他url(例如www.mysite.com )应该被引导到PHP网站。
我的虚拟主机configuration如下所示:
... 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> ...
这将每个请求指向正确的处理程序。 但是,我的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')), ...
这不匹配任何url,因为它期望他们以api开头。 这个前缀当然是在它到达之前被剥离的(当请求到达这里时,它们的格式是1.0/oauth等)。
有没有办法将完整的URL传递给Django?
mod_wsgi的作者Graham Dumpleton提出了一些解决这个问题的方法,两者都起作用(见下面的接受答案)。
我去了他在UPDATE 1build议的解决scheme。追加/api文件path解决了这个问题:
WSGIScriptAlias /api /var/www/mysite.com/apache/django.wsgi/api
即,当到达Django时, /api不再被剥离掉。
所以这里是我的工作configuration的相关部分:
... 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> ...
你所看到的正是它的工作原理。 WSGI应用程序不应该关心也不能embedded关于它在哪里安装的知识。 换句话说,您不应该在urls.py中将“api”作为前缀。 为什么你认为你需要在urls.py中使用“api”前缀?
更新1
您可以使用:
WSGIScriptAlias /api /var/www/mysite.com/apache/django.wsgi/api
我现在不记得确切的公式,是否正确,但尝试一下。