1

在处理标准输入方面,我在使用 lighttpd 和 CGI​​ 脚本时遇到了一些问题。Lighttpd 似乎在客户端发出 GET 请求后立即关闭标准输入。以前,我可以使用 thttpd 允许 http 客户端连接到端口 80,然后透明地重定向到单独的内部端口。这让我可以用 Adob​​e Flash 和 XML 套接字做一些有趣的事情。我应该更多地解释这一点。客户端可以是任何东西,一个 Adob​​e 应用程序,一些移动应用程序,它发送 GET /redirect.cgi 到服务器,服务器的 Web 服务器然后将其交给 CGI,CGI 进程然后与该客户端建立一个套接字连接,通过该套接字连接它可以发送/接收任何它想要的东西。下面是一个使用 netcat 作为服务器的简单 CGI 示例:

(服务器只是 nc -l 9999 )

test@test:/var/www/cgi-bin$ cat > redirect.cgi <<EOF ; chmod 0755 redirect.cgi
#!/bin/sh

echo -e "Content-type: text/html\r\n\r\n";`

nc 127.0.0.1 9999
EOF

现在我们连接到 Web 服务器并向 cgi 发出 GET,然后在客户端和服务器上进行对话:

-- client test

nc 127.0.0.1 80
GET /cgi-bin/redirect.cgi HTTP/1.0
HOST: test.example.com

HTTP/1.0 200 OK
Content-type: text/html

server: this is the server speaking
client: this is is a test

正如您在上面看到的,客户端的 GET 请求导致 thttpd 执行 redirect.cgi 并且 stdin 保持打开状态,从而允许我们继续向服务器发送数据,直到我们关闭客户端套接字。相比之下,使用 lighttpd,我看到:

GET /cgi-bin/redirect.cgi HTTP/1.0
HOST: test.example.com

HTTP/1.0 200 OK
Content-type: text/html
Connection: close
Date: Tue, 29 May 2012 11:35:37 GMT
Server: lighttpd/1.4.26

使用 lighttpd,cgi 的标准输入会立即关闭。有没有办法可以将 lighttpd 配置为不同的行为?或者,是否有不同类型的请求(可能是 POST 或 CONNECT?)可用于实现所需的行为?我尝试了 POST,但似乎有一个固定的内容长度对我不起作用,CONNECT 的行为似乎与 GET / 相同。我需要 lighttpd 来保持 CGI 的标准输入打开,直到客户端关闭其套接字。欢迎大家提出意见。

我也尝试使用 mod_proxy。所以我做了:

$HTTP["host"] =~ "" {
        proxy.server = (
                "/testport" => (
                        "test" => (
                                 "host" => "127.0.0.1",
                                 "port" => 9999,
                         )
                )
        )
}

我看到的是:

$ nc -C -l 9999
GET /testport HTTP/1.0
Host: www.example.com
X-Forwarded-For: 127.0.0.1
X-Host: www.example.com
X-Forwarded-Proto: http

server: saying hello
blah

但是“服务器:打招呼”的东西永远不会回到客户端,所以这对我也不起作用。

4

0 回答 0