您面临的问题是nc不知道Web客户端何时完成请求,以便响应该请求。
Web会话应该按以下方式进行。
TCP session is established.
Browser Request Header: GET / HTTP/1.1
Browser Request Header: Host: www.google.com
Browser Request Header: \n
Server Response Header: HTTP/1.1 200 OK
Server Response Header: Content-Type: text/html
Server Response Header: Content-Length: 24
Server Response Header: \n
Server Message Body: <html>sample html</html>
Server Message Body: \n
The server closes the TCP session.
以 "\n" 开头的行只是空行,没有空格,仅包含换行符。
我通过 xinetd 启动我的 bash httpd,有关 xinetd 的教程请参考xinetd 教程。它还会将日期、时间、浏览器 IP 地址和整个浏览器请求记录到日志文件中,并计算 Server 头响应的 Content-Length。
user@machine:/usr/local/bin
x=0;
Log=$( echo -n "["$(date "+%F %T %Z")"] $REMOTE_HOST ")$(
while read I[$x] && [ ${#I[$x]} -gt 1 ];do
echo -n '"'${I[$x]} | sed -e's,.$,",'; let "x = $x + 1";
done ;
); echo $Log >> /var/log/bash_httpd
Message_Body=$(echo -en '<html>Sample html</html>')
echo -en "HTTP/1.0 200 OK\nContent-Type: text/html\nContent-Length: ${#Message_Body}\n\n$Message_Body"
为增加更多功能,可以整合以下内容。
METHOD=$(echo ${I[0]} |cut -d" " -f1)
REQUEST=$(echo ${I[0]} |cut -d" " -f2)
HTTP_VERSION=$(echo ${I[0]} |cut -d" " -f3)
If METHOD = "GET" ]; then
case "$REQUEST" in
"/") Message_Body="HTML formatted home page stuff"
;;
/who) Message_Body="HTML formatted results of who"
;;
/ps) Message_Body="HTML formatted results of ps"
;;
*) Message_Body= "Error Page not found header and content"
;;
esac
fi
愉快的Bash吧!
nc
会在连接建立后立即发送响应,这并不总是在客户端发送HTTP GET请求之前发生。对于像Chrome和Firefox这样的许多客户端来说,这似乎不是一个问题,但对于至少Safari来说,这被视为错误,不会发出任何请求。 - undefined