Django/WSGI 和 PHP 如何在 Apache 上共享 /?
我有一個執行已建立的 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 文件以獲取更多資訊。