简单的CGI Python Web服务器+PHP无法工作

3

现在已经有类似的问题在其他地方被问到了。然而,我尝试了那里提供的建议解决方案,但没有帮助。

我正在运行以下Python CGI Web服务器:

#!/usr/bin/python
from BaseHTTPServer import HTTPServer
from CGIHTTPServer import CGIHTTPRequestHandler
serve = HTTPServer(("",80),CGIHTTPRequestHandler)
serve.serve_forever()

在“cgi-bin”目录下,存储了以下php文件“simple.php”:
 #!/usr/bin/php
 <html>
 <head>
 <title>PHP Test</title>
 </head>
 <body>
 <?php echo '<p>Hello World</p>'; ?> 
 </body>
 </html>

这个文件已经被赋予可执行权限,并且可以在服务器上通过命令行正常执行。

但是,如果我启动服务器并尝试使用"http://server/cgi-bin/simple.php"访问页面,则只会得到一个空白页面,在服务器标准输出中没有看到任何错误信息。

我查看了CGIHTTPServer.py的代码,认为问题可能出现在进程分叉以执行cgi-bin时,使用dup2操作文件描述符(stdin、stdout)时。然而,我不知道如何使其正常工作。这个简单的问题困扰了我几个小时,真的很感激任何形式的帮助。

服务器机器是一个Ubuntu 9.04盒子。


4
我认为你在问题中漏了一个关键点,就是CGIHTTPServer不知道如何直接运行php代码。 在Apache下,PHP代码由mod_php处理。 你需要添加一些粘合代码才能使其正常工作。 - user535883
我认为CGIHTTPServer 确实知道如何直接运行php代码。这是我做的。我将os.execve()调用放在CGIHTTPServer中的fork之前。然后我看到它在命令行输出了“Hello world”,然后Web服务器终止(显然)。所以CGIHTTPServer正在执行php脚本。 - Methos
2个回答

3

#!/usr/bin/php并不能让你的脚本作为CGI运行,它只能让它作为命令行脚本运行。如果你有一个php-cgi二进制文件,请使用它;否则,你可能需要在脚本中加入一些不好的hack代码,比如:

#!/usr/bin/php
Content-Type: text/html

<html>
<head>
<title>PHP Test</title>
</head>
<body>
<?php echo '<p>Hello World</p>'; ?> 
</body>
</html>

我不确定我理解您的意思。您是说在CGIHTTPServer中的Python代码无法执行php脚本吗?这是我在CGIHTTPServer中所做的。在分叉之后,我不是直接执行脚本,而是在分叉之前放置了os.execve()调用。我看到的是它在命令行上输出了“Hello world”,并且Web服务器终止(显然)。因此,CGIHTTPServer正在执行php脚本。 - Methos
我不确定那是什么意思。问题在于/usr/bin/php不能作为CGI脚本运行,而CGIHTTPServer需要的正是这个(因此得名)。 - user149341
我的观点是 - CGI服务器只是一个花哨的名字。在底层,所有的代码都在分叉一个进程并执行CGI脚本。该脚本的输出被重定向到连接到客户端浏览器的套接字。因此,CGI脚本的输出应直接发送到浏览器。因此,如果Python代码可以执行该脚本(它确实可以),那么就不应该有任何问题。 - Methos
1
好的。脚本必须输出HTTP头以及内容。 - user149341

0

使用: handler.cgi_directories.append('/')

否则,您的 CGI 脚本将仅在它们是 '/cgi-bin' 或 '/htbin' 文件夹时才会被执行,如 此处 所述。基本上,cgi_directories 意味着从该文件夹及其所有子文件夹中执行 CGI。希望这有所帮助。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接