2010-03-03 39 views
3

我正在用PHP的CGI包裝進行時間問題。我對CGI和PHP知之甚少。用於PHP的CGI包裝的問題

這就是我知道的系統:

  • 的Solaris 10在386
  • 了Suhosin
  • PHP運行正常爲CGI,使用的cgiwrap(http://cgiwrap.sourceforge.net/)。我無法在服務器上找到一個示例wrapper.cgi來查看。
  • 共享主機(虛擬主機),所以我沒有訪問Apache配置。但管理員沒有幫助。切換主機不是一個選項。
  • 選項指令不能在.htaccess中覆蓋(例如ExecCGI)。

htaccess的:

AddHandler php-handler .php 
Action php-handler "/bin/test.cgi" 

〜/的public_html/bin中/ test.cgi:

#!/usr/bin/sh 

# Without these 2 lines, I get an Internal Server Error 
echo "Content-type: text/html" 
echo "" 

exec "/path/to/php-cgi" 'foo.php'; 

/bin/foo.php:

<?php 
echo "this is foo.php!"; 

輸出的http://mysite.com/bin/test.cgi

X-Powered-By: PHP/5.2.11 Content-type: text/html echo "Content-type: text/html" echo "" exec "/path/to//php-cgi" 'foo.php'; 

輸出爲http:/ /mysite.com/anypage.php:

X-Powered-By: PHP/5.2.11 Content-type: text/html echo "Content-type: text/html" echo "" exec "/path/to//php-cgi" 'foo.php'; 

我注意的事情是:

  • PHP被執行,如由X-Powered-By ...頭指出。
  • 在結果中輸出/bin/test.cgi
  • 無論我把它作爲exec的第二個參數,它都不會傳遞給php二進制文件。我試過'-i'獲得的phpinfo,'-v'得到的版本...
  • 當我通過外殼執行test.cgi,我得到預期的結果(參數傳遞到PHP,並將其反映在輸出)。

有關如何使這項工作的任何想法?

UPDATE

  • 看來,test.cgi是出現的原因是由於錯誤。任何時候發生致命錯誤,無論是在CGI本身還是在執行命令exec時,都會導致cgi的出現。
  • test.cgi之內,我可以通過exec "/path/to/php-cgi" -h獲得正確的輸出結果(我從CLI獲得的結果與我的結果相同)。

回答

1

爲什麼不直接將php-cgi文件放在bin文件夾中,並將其作爲您的處理程序而不是test.cgi調用它。

+0

我來試試。該包裝方法是一個我見過很多,所以它是唯一一個我熟悉的(雖然包裝通常命名爲比「test.cgi」以外的東西)。 – kentr

+0

當我這樣做,我在日誌中得到一個錯誤:「文件不存在:/full/path/to/public_html/bin/php-cgi/bin/foo.php」。 它固定該腳本的路徑上定義爲處理程序的路徑,並嘗試使用新的值作爲處理程序。(請注意,我在一個子目錄中進行此操作以保留實際的網站。) – kentr

+0

我的意思是直接將php-cgi文件複製到您的cgi可執行文件中。 test.cgi所在的地方。 – blockhead

1

真的不能告訴,但這裏有一些想法:

  • 你執行的是PHP腳本爲PHP本身處理響應頭之前不輸出任何東西。

  • 調用腳本嘗試exec "/path/to/php-cgi \"/path/to/script/foo.php\""

希望我能幫上忙。

編輯

你可能想看看斯圖爾特·赫伯特的this post。格外,他寫道部分:

#!/bin/bash 

/usr/bin/php-cgi "[email protected]" 

這個腳本只是執行我們的PHP CGI可執行文件的集中副本,通過任何參數的Apache呼籲與bash腳本。

+0

謝謝。我應該提到,我嘗試過,並得到了500錯誤(內部服務器錯誤)。 – kentr

+0

嘗試沒有標題,就是。 – kentr

+0

對於第二個(使用引號將整個命令調用腳本),顯然exec將整個第一個參數視爲程序名稱。我得到這個錯誤(在日誌中):/ path/to/php-cgi -nf「foo.php」:找不到。 (-nf顯然是php-cgi必需的選項)。 – kentr

1

一對夫婦的想法:

  1. 我敢肯定了Suhosin不會在這裏做你多好。並不是說它會傷害任何東西。但是,在這種情況下,PHP腳本會在非常未經授權的用戶(一個希望)來執行。系統訪問控制工具將使腳本保持沙箱狀態。

  2. 這是我的理解是,你可以使用下面的配置指令(有趣的是你的php-cgi的二進制位於/usr/bin/php-cgi你可以訪問並運行PHP腳本,CGI程序的常規方式。

    ScriptAlias /local-bin /usr/bin
    AddHandler application/x-httpd-php5 php
    Action application/x-httpd-php5 /local-bin/php-cgi

    棒,在配置,上傳的PHP文件。從您的瀏覽器中點擊php文件,它都應該工作。

+0

謝謝 - 這是一個共享的宿主環境,所以我沒有訪問Apache配置,並且不能對suhosin的存在做任何事情。 我嘗試了您的建議,不使用ScriptAlias指令,使用php-cgi的本地副本,並在Action指令中使用「/ bin/php-cgi」。我在日誌中發現錯誤:「文件不存在:/full/path/to/public_html/bin/php-cgi/bin/foo.php」。它將腳本的路徑添加到定義爲處理程序的路徑中,並嘗試將該新值用作處理程序。 (請注意,我現在在一個子目錄中保存實際的網站。) – kentr

0

你得到的內部服務器錯誤,因爲它預計,文件包含的Perl,而不是PHP代碼?我的意思是,<?php ?>標籤在哪裏(沒有它們,這是文本,不會被解析爲PHP)...猜猜不能像這樣添加類型 - 我建議在<Directory>指令中添加類型 - 以便讓其他人不受影響(我認爲模式的路徑是問題)。除了exec()預計3個參數應該包含在括號中 - 至少在PHP中。