在处理标准输入方面,我在使用 lighttpd 和 CGI 脚本时遇到了一些问题。Lighttpd 似乎在客户端发出 GET 请求后立即关闭标准输入。以前,我可以使用 thttpd 允许 http 客户端连接到端口 80,然后透明地重定向到单独的内部端口。这让我可以用 Adobe Flash 和 XML 套接字做一些有趣的事情。我应该更多地解释这一点。客户端可以是任何东西,一个 Adobe 应用程序,一些移动应用程序,它发送 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
但是“服务器:打招呼”的东西永远不会回到客户端,所以这对我也不起作用。