Apache 與 PHP 執行 CGI 模式:php 可執行程序本身,我需要在配置中更改什麼
我正在嘗試在現代Apache 2.4.6中安裝 pre-Iraq-Surge 4.4.9 PHP ,並希望在 CGI 模式下執行它。
目前配置如下:
PHP 執行檔是
/usr/local/php-4.4.9/bin/php
虛擬伺服器中存在一個測試文件
$documentroot/phphere/index.php
,它包含:<?php phpinfo(); ?>
如果我執行
index.php
usingphp
,一切都是 hunky dory。跑步
/usr/local/php-4.4.9/bin/php $documentroot/phphere/index.php | less
產量
X-Powered-By: PHP/4.4.9 Content-type: text/html <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "DTD/xhtml1-transitional.dtd"> <html><head> <style type="text/css"> body {background-color: #ffffff; color: #000000;} body, td, th, h1, h2 {font-family: sans-serif;} pre {margin: 0px; font-family: monospace;} a:link {color: #000099; text-decoration: none; background-color: #
等等
優秀的!
但是,通過 Web 客戶端呼叫
index.php
會導致:Warning: Unexpected character in input: '' (ASCII=1) state=1 in /usr/local/php-4.4.9/bin/php on line 277 Warning: Unexpected character in input: '' (ASCII=15) state=1 in /usr/local/php-4.4.9/bin/php on line 277 Parse error: syntax error, unexpected T_STRING in /usr/local/php-4.4.9/bin/php on line 277
**如果一個人自己處理php執行檔,**這正是一個人得到的輸出,即輸出
/usr/local/php-4.4.9/bin/php /usr/local/php-4.4.9/bin/php
(減去額外生成的任何標題)。
好的,所以 Apache 設置中存在一些問題。但是什麼?
配置如下:
AddType application/x-httpd-php .php AddType application/x-httpd-php-source .phps ScriptAlias /outsidephp /usr/local/php-4.4.9/bin Action application/x-httpd-php /outsidephp/php
如果我理解正確,AddType會標記任何
.php
以 MIME type結尾的文件application/x-httpd-php
。如果 PHP 應通過 CGI 約定執行,則每當
application/x-httpd-php
請求具有 MIME 類型的文件時執行的執行檔用Action指示。ScriptAlias給出了php
執行檔所在目錄的URL 路徑。(雖然這種語法聽起來很尷尬,為什麼沒有一個命令呢?)此外,該選項
ExecCGI
已在包含的目錄中設置,index.php
並且該文件系統樹上的 SELinux 上下文標有httpd_sys_script_exec_t
.請注意,絕對沒有
AddHandler cgi-script .php
在配置中,因為這使 Apache 嘗試
.php
直接執行以腳本結尾的文件,這可以預見地失敗並出現錯誤 500:Error message: End of script output before headers: index.php
究竟出了什麼問題?
如何讓 Apache 執行
php index.php
代替
php php
(即很可能
php php index.php
)
處理程序的Apache 文件說最初請求的文件由 PATH_TRANSLATED 環境變數指向。它沒有提到 SCRIPT_FILENAME。
CGI RFC 3875也沒有提到 SCRIPT_FILENAME 。另一方面,您的範例表明您正在使用的 php-cgi 需要 SCRIPT_FILENAME 中的 PHP 文件的名稱。這似乎依賴於未定義的行為。
請注意,PHP 4.4.9 相當舊,而您使用的 Apache 伺服器可能較新。因此,從那時起,Apache 有可能在 SCRIPT_FILENAME 中傳遞了腳本文件的名稱(也),並且從那時起行為發生了變化。
您不需要 perl 來分配環境變數,一個簡單的 scell 腳本也可以,但請使用您喜歡的。
#!/bin/sh SCRIPT_FILENAME=$PATH_TRANSLATED exec /usr/local/php-4.4.9/bin/php