我正在使用CGI包装器来获取PHP的错误。我对CGI和PHP很少了解CGI。
以下是我对该系统的了解:
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';
我注意到的是:
X-Powered-By ...
标题所示。/bin/test.cgi
的来源在结果中输出。exec
的第二个参数放置什么,它都不会传递给php二进制文件。我已尝试'-i'
获取phpinfo,'-v'
以获取版本... test.cgi
时,我得到预期的结果(参数传递给php,它会反映在输出中)。有关如何使其发挥作用的任何想法?
更新
test.cgi
的来源出现的原因似乎是由于错误。无论何时发生致命错误,无论是在cgi本身内还是由exec
执行的命令,都会导致cgi的来源出现。test.cgi
内,我可以使用exec "/path/to/php-cgi" -h
获得正确的输出(我得到与CLI相同的内容)。答案 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)
有几点想法:
我很确定suhosin在这里不会对你有好处。不是说它会伤害任何东西。但是,在这种情况下,PHP脚本将在非常非特权用户(希望)下执行。系统访问控制工具将使脚本保持沙箱状态。
我的理解是您可以使用以下配置指令(有趣的是您的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中。