PHP的CGI包装器的问题

时间:2010-03-03 01:00:47

标签: php cgi

我正在使用CGI包装器来获取PHP的错误。我对CGI和PHP很少了解CGI。

以下是我对该系统的了解:

  • Solaris 10 on a 386
  • 了Suhosin
  • PHP通常作为CGI运行,带有cgiwrap(http://cgiwrap.sourceforge.net/)。我无法在服务器上找到一个示例wrapper.cgi来查看。
  • 共享主机(虚拟主机),所以我无法访问Apache配置。但管理员没有帮助。切换主机不是一种选择。
  • 无法在.htaccess(例如ExecCGI)中覆盖Options指令。

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'以获取版本...
  • 当我通过shell执行test.cgi时,我得到预期的结果(参数传递给php,它会反映在输出中)。

有关如何使其发挥作用的任何想法?

更新

  • test.cgi来源出现的原因似乎是由于错误。无论何时发生致命错误,无论是在cgi本身内还是由exec执行的命令,都会导致cgi的来源出现。
  • test.cgi内,我可以使用exec "/path/to/php-cgi" -h获得正确的输出(我得到与CLI相同的内容)。

4 个答案:

答案 0 :(得分:1)

为什么不直接将php-cgi文件放在bin文件夹中,并将其作为处理程序而不是test.cgi调用它。

答案 1 :(得分:1)

不能说,但这里有一些想法:

  • 在执行php脚本之前不要输出任何内容,因为php本身会处理响应头。

  • 要调用脚本,请尝试exec "/path/to/php-cgi \"/path/to/script/foo.php\""

希望我能提供帮助。

编辑

你可能想看看Stuart Herbert的this post。特别是他写的部分:

#!/bin/bash

/usr/bin/php-cgi "$@"

这个脚本只是执行我们的PHP CGI可执行文件的中央副本,通过Apache调用bash脚本的任何参数。

答案 2 :(得分: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文件,它应该都可以工作。

答案 3 :(得分:0)

您收到内部服务器错误,因为它希望该文件包含Perl,而不是PHP代码?我的意思是,<?php ?>标签在哪里(没有它们这是文本,不会被解析为PHP)...猜猜一个人不能像这样添加类型 - 我建议在<Directory>内添加AddType指令 - 为了让其余部分不受影响(我想,路径作为模式是问题)。除了exec()期望3个参数应该用括号括起来 - 至少在PHP中。