Назад | Перейти на главную страницу

Могу ли я настроить apache / mod_wsgi так, чтобы путь URL-адреса псевдонима не удалялся до того, как он достигнет моего приложения Django?

Я пытаюсь настроить 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

Я не могу сейчас вспомнить точную формулу и правильно ли она, но попробуйте.