谁能告诉我为什么我bad request在执行这个命令时得到
echo -e "GET http://www.yellowpages.com.eg/Mjg3NF9VUkxfMTEwX2h0dHA6Ly93d3cubG90dXMtYWlyLmNvbV8=/Lotus-Air/profile.html HTTP/1.1\n\n" | nc www.yellowpages.com 80
Run Code Online (Sandbox Code Playgroud)
同一个网站在浏览器中打开得很好。
HTTP 请求中的标头必须使用 CRLF (Windows) 行结尾。(请参阅Wikipedia或RFC 2616。)许多服务器支持 LF (Unix) 行结尾作为扩展名,但不是这个。
此外,Host:正如Warren Young 指出的那样,HTTP 1.1 需要一个标题行。(请参阅维基百科或RFC 2616)。
echo -e "GET http://www.yellowpages.com.eg/Mjg3NF9VUkxfMTEwX2h0dHA6Ly93d3cubG90dXMtYWlyLmNvbV8=/Lotus-Air/profile.html HTTP/1.1\r\nHost: www.yellowpages.com.eg\r\n\r\n" | nc www.yellowpages.com 80
Run Code Online (Sandbox Code Playgroud)
或更清晰
sed $'s/$/\r/' <<EOF | nc www.yellowpages.com 80
GET http://www.yellowpages.com.eg/Mjg3NF9VUkxfMTEwX2h0dHA6Ly93d3cubG90dXMtYWlyLmNvbV8=/Lotus-Air/profile.html HTTP/1.1
Host: www.yellowpages.com.eg
EOF
Run Code Online (Sandbox Code Playgroud)
但是为什么不使用 wget 或 curl,它们将构造一个有效的请求而不费吹灰之力,并且仍然允许您在必要时指定自定义标头?
您需要在 GET 请求中包含域名。您已经告诉nc要连接的域名,它知道去哪里找到服务器,但nc不会将其传递给服务器。如果服务器托管多个域,它将不知道向您发送哪个域。您传递的请求标头echo应该包含这个完整的域,如下所示:
echo "GET http://domain.tld/path" | nc domain.tld 80
Run Code Online (Sandbox Code Playgroud)
请注意,您还可以将-e参数放到 echo 中,并在结尾处转义换行符。该-e是抑制回声的添加一个新行自然倾向,那么你自己添加一个。
编辑 1:是否有某种原因您没有使用像curl这样可以处理所有标题可能性并为您提供有用输出的普通下载工具?你真的需要自己处理标题聊天吗?curl http://domain.tld/path应该给你更可靠的输出,因为程序员已经为你解决了所有的可能性。
编辑 2:有关协议规范的信息,请参阅Warren 的回答。TL;DR:如果您指定 1.1,则必须遵守该协议。如果你指定 1.0,你通常可以像上面那样进行请求。
使用 HTTP/1.1 使用 echo 和 netcat 发出请求,试试这个:
echo "GET http://domain.tld/path HTTP/1.1\nHost: domain.tld\n" | nc domain.tld 80
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
26148 次 |
| 最近记录: |