Я пытаюсь настроить Apache для размещения веб-службы Django и веб-сайта PHP.
Все URL с шаблоном www.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>
...
Это направляет каждый запрос правильному обработчику. Однако мой Джанго 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, предложил несколько подходов, чтобы исправить это, оба из которых работали (см. Принятый ответ ниже).
Я выбрал решение, которое он предлагает в ОБНОВЛЕНИИ 1. Добавляя /api
к пути к файлу решает проблему:
WSGIScriptAlias /api /var/www/mysite.com/apache/django.wsgi/api
т.е. /api
больше не удаляется из URL-адреса, когда он достигает Django.
Итак, вот соответствующие части моей рабочей конфигурации:
...
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 не должно заботиться о том, где оно монтируется, или встраивать информацию о нем. Другими словами, у вас не должно быть префикса api в urls.py. Как вы думаете, зачем вам нужен префикс api в urls.py?
ОБНОВЛЕНИЕ 1
Вы можете использовать:
WSGIScriptAlias /api /var/www/mysite.com/apache/django.wsgi/api
Я не могу сейчас вспомнить точную формулу и правильно ли она, но попробуйте.