Как Django/WSGI и PHP могут поделиться / на Apache?

У меня есть сервер, на котором работает установленный сайт PHP, а также некоторые приложения Django.

В настоящее время VirtualHost, настроенный для PHP, прослушивает порт 80, а запросы к определенным каталогам передаются в VirtualHost, настроенный для Django с WSGI.

Я хотел бы изменить это так, чтобы Django обрабатывал все, что не существует, как скрипт PHP или статический файл.

Например,

/ -> анализируется PHP как index.php
/page.php -> обычно анализируется как PHP
/images/border.jpg -> служил статическим файлом
/johnfreep -> обрабатывается Django (интерпретируется urls.py)
/ pages / john -> обработано Джанго
/(все остальное) - > обработано Джанго

У меня есть несколько идей. Кажется, варианты "php first" или "wsgi first".

  • установите Django на порт 80 и настройте Apache на пропуск всех известных файлов PHP, CSS или изображений. Может быть, с помощью SetHandler? Все остальное отправляется в Django для анализа с помощью urls.py.

  • Установите скрипт, который будет ссылаться на Django как обработчик 404 на PHP. Таким образом, если файл не найден по имени, он отправляет путь запроса в VirtualHost с запущенным Django для анализа.

1 ответ

Решение

Используйте метод, описанный в:

http://code.google.com/p/modwsgi/wiki/ConfigurationGuidelines

Таким образом, настройте DocumentRoot как обычно для статических файлов, файлов php и т. Д. Затем добавьте:

AddHandler wsgi-script .wsgi

в блок каталога для DocumentRoot или глобально для сервера.

Вам, однако, нужно будет иметь:

Options ExecCGI

включен для DocumentRoot сейчас, если вы еще этого не сделали.

Затем также добавьте:

RewriteEngine On
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^(.*)$ /site.wsgi/$1 [QSA,PT,L]

где site.wsgi находится в DocumentRoot и является файлом сценария WSGI, который сопоставляется с вашим приложением Django.

В файле сценария Django WSGI измените его на использование:

import django.core.handlers.wsgi

_application = django.core.handlers.wsgi.WSGIHandler()

import posixpath

def application(environ, start_response):
    # Wrapper to set SCRIPT_NAME to actual mount point.
    environ['SCRIPT_NAME'] = posixpath.dirname(environ['SCRIPT_NAME'])
    if environ['SCRIPT_NAME'] == '/':
        environ['SCRIPT_NAME'] = ''
    return _application(environ, start_response)

Это должно быть так.

Любой запрос, который сопоставляется с фактическим файловым ресурсом в DocumentRoot, будь то статический файл или файл php, в том числе в качестве установки DirectoryIndex, например index.php, будет обрабатываться нормально. Любой другой URL, который в противном случае привел бы к 404, вместо этого будет перенаправлен в приложение Django.

Файлы / johnfreep и / pages / john должны иметь соответствующий URL-адрес, как если бы он был смонтирован в корневом каталоге, в файле urls.py.

Если Django не знает, что делать с URL-адресом, Django вернет 404.

Прочитайте вики-документ для получения дополнительной информации.

Другие вопросы по тегам