Apache-2.2

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

  • January 29, 2011

我有一個執行已建立的 PHP 站點的伺服器,以及一些 Django 應用程序。

目前,為 PHP 設置的 VirtualHost 偵聽埠 80,並且對某些目錄的請求被代理到為 Django 設置的帶有 WSGI 的 VirtualHost。

我想更改它,以便 Django 處理任何不作為 PHP 腳本或靜態文件存在的內容。

例如,

/ -> 由 PHP 解析為 index.php

/page.php -> 通常解析為 PHP

/images/border.jpg -> 作為靜態文件

/johnfreep -> 由 Django 處理(由 urls.py 解釋)

/pages/約翰 -> 由 Django 處理

/(其他) - > 由 Django 處理

我有幾個想法。似乎選項是“php first”或“wsgi first”。

  • 在埠 80 上設置 Django,並設置 Apache 跳過所有已知的 PHP、CSS 或圖像文件。也許使用 SetHandler?任何其他的東西都交給 Django 由 urls.py 解析。
  • 設置一個腳本,將所有內容引用到 Django 作為 PHP 上的 404 處理程序。因此,如果找不到文件的名稱,它會將請求路徑發送到執行 Django 的 VirtualHost 以進行解析。

使用方法描述於:

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 必須在 urls.py 文件中具有相應的 URL,就像安裝在根目錄一樣。

如果 Django 不知道如何處理 URL,則 Django 將返回 404。

閱讀 wiki 文件以獲取更多資訊。

引用自:https://serverfault.com/questions/226449