5

我有以下用于处理 CGI 的 HTTP 服务器的最小代码,源自内胎上的几个示例:

#!/usr/bin/env python

import BaseHTTPServer
import CGIHTTPServer
import cgitb;

cgitb.enable()  # Error reporting

server = BaseHTTPServer.HTTPServer
handler = CGIHTTPServer.CGIHTTPRequestHandler
server_address = ("", 8000)
handler.cgi_directories = [""]

httpd = server(server_address, handler)
httpd.serve_forever()

然而,当我执行脚本并尝试使用 CGI 在同一目录中运行测试脚本时http://localhost:8000/test.py,我看到的是脚本的文本,而不是执行的结果。

权限设置都正确,并且测试脚本本身不是问题(python -m CGIHTTPServer当脚本驻留在 cgi-bin 中时,我可以使用 很好地运行它)。我怀疑这个问题与默认的 CGI 目录有关。

如何让脚本执行?

4

3 回答 3

4

我的怀疑是正确的。派生此代码的示例显示了将默认目录设置为服务器脚本所在目录的错误方法。要以这种方式设置默认目录,请使用:

handler.cgi_directories = ["/"]

注意:如果您不在任何类型的防火墙后面,这会打开潜在的巨大安全漏洞。这只是一个有启发性的例子。仅在极其小心的情况下使用。

于 2013-07-12T15:05:45.920 回答
3

['/db/cgi-bin']如果 .cgi_directories 需要多层子目录(例如),该解决方案似乎不起作用(至少对我而言)。子类化服务器并更改is_cgidef 似乎有效。这是我在您的脚本中添加/替换的内容:

from CGIHTTPServer import _url_collapse_path
class MyCGIHTTPServer(CGIHTTPServer.CGIHTTPRequestHandler):  
  def is_cgi(self):
    collapsed_path = _url_collapse_path(self.path)
    for path in self.cgi_directories:
        if path in collapsed_path:
            dir_sep_index = collapsed_path.rfind(path) + len(path)
            head, tail = collapsed_path[:dir_sep_index], collapsed_path[dir_sep_index + 1:]
            self.cgi_info = head, tail
            return True
    return False

server = BaseHTTPServer.HTTPServer
handler = MyCGIHTTPServer
于 2014-08-18T00:01:40.353 回答
0

以下是如何将服务器上的每个 .py 文件制作为 cgi 文件的方法(您可能不希望将其用于生产/公共服务器;):

import BaseHTTPServer
import CGIHTTPServer
import cgitb; cgitb.enable()

server = BaseHTTPServer.HTTPServer

# Treat everything as a cgi file, i.e.
# `handler.cgi_directories = ["*"]` but that is not defined, so we need
class Handler(CGIHTTPServer.CGIHTTPRequestHandler):  
  def is_cgi(self):
    self.cgi_info = '', self.path[1:]
    return True

httpd = server(("", 9006), Handler)
httpd.serve_forever()
于 2016-05-02T18:34:39.983 回答