У меня есть сервер, на котором запущен установленный сайт 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».
настроить Django на порт 80 и настроить Apache на пропуск всех известных файлов PHP, CSS или изображений. Может быть, с помощью SetHandler? Все остальное отправляется в Django для анализа urls.py.
Настройте скрипт, ссылающийся на Django как на обработчик ошибки 404 на PHP. Итак, если файл по имени не найден, он отправляет путь запроса на VirtualHost, на котором запущен Django, для анализа.
Используйте метод, описанный в:
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.
Прочтите вики-документ для получения дополнительной информации.