Php

Apache 與 PHP 執行 CGI 模式:php 可執行程序本身,我需要在配置中更改什麼

  • July 25, 2018

我正在嘗試在現代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.phpusing php,一切都是 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

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