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

Как 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 -> обрабатывается Django
/ (что-нибудь еще) -> обрабатывается Django

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

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

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

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

AddHandler wsgi-script .wsgi

в блок Directory для DocumentRoot или глобально для server.

Однако вам понадобится:

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.

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