Как 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.
Прочитайте вики-документ для получения дополнительной информации.