Django/WSGI 和 PHP 如何在 Apache 上共享 /?

Django/WSGI 和 PHP 如何在 Apache 上共享 /?

我有一个运行已建立的 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 文档以了解更多信息。

相关内容