我有一个运行已建立的 PHP 站点以及一些 Django 应用程序的服务器。
目前,为 PHP 设置的 VirtualHost 监听端口 80,对某些目录的请求则代理到使用 WSGI 为 Django 设置的 VirtualHost。
我想改变它,以便 Django 可以处理任何不存在的 PHP 脚本或静态文件。
例如,
/ ->由 PHP 解析为 index.php
/page.php ->通常作为 PHP 解析
/images/border.jpg ->作为静态文件提供
/johnfreep ->由 Django 处理(由 urls.py 解释)
/pages/john ->由 Django 处理
/(其他任何内容) - >由 Django 处理
我有几个想法。似乎选项是“php first”或“wsgi first”。
在端口 80 上设置 Django,并将 Apache 设置为跳过所有已知的 PHP、CSS 或图像文件。也许使用 SetHandler?其他所有内容都将发送到 Django 以供 urls.py 解析。
设置一个脚本,将所有内容引用到 Django 作为 PHP 上的 404 处理程序。因此,如果找不到名称对应的文件,它会将请求路径发送到运行 Django 的 VirtualHost 进行解析。
答案1
使用方法描述:
http://code.google.com/p/modwsgi/wiki/ConfigurationGuidelines#The_Apache_Alias_Directive
因此,对于静态文件和 php 文件等,DocumentRoot 设置与正常设置一样。然后添加:
AddHandler wsgi-script .wsgi
到 DocumentRoot 的目录块,或全局到服务器。
不过,您还需要:
Options ExecCGI
如果尚未启用 DocumentRoot,请立即启用。
然后还添加:
RewriteEngine On
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^(.*)$ /site.wsgi/$1 [QSA,PT,L]
其中 site.wsgi 位于 DocumentRoot 中,是映射到您的 Django 应用程序的 WSGI 脚本文件。
在 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)都将得到正常处理。任何其他会导致 404 的 URL 都将路由到 Django 应用程序。
/johnfreep 和 /pages/john 必须具有相应的 URL,就像在 urls.py 文件中安装在根目录一样。
如果 Django 不知道如何处理 URL,那么 Django 将返回 404。
阅读 wiki 文档以了解更多信息。