なぜ私が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
同じWebサイトがブラウザーで正常に開きます。
HTTPリクエストのヘッダーはCRLF(Windows)の行末を使用する必要があります。 ( Wikipedia または RFC 2616 を参照してください。)多くのサーバーはLF(Unix)行末を拡張子としてサポートしていますが、これはサポートしていません。
さらに、HTTP 1.1では Warren Youngが指摘 のようにHost:
ヘッダー行が必要です。 ( Wikipedia または 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
より読みやすい
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
しかし、汗をかかずに有効なリクエストを作成し、必要に応じてカスタムヘッダーを指定できるようにするwgetまたはcurlを使用しないのはなぜですか?
GETリクエストにドメイン名を含める必要があります。接続するドメイン名をnc
に伝えましたが、サーバーの検索場所がわかっていますが、nc
はそれをサーバーに渡しません。サーバーが複数のドメインをホストしている場合は、どのドメインを送信するかがわかりません。 echo
で渡すリクエストヘッダーには、次のようにこの完全なドメインを含める必要があります。
echo "GET http://domain.tld/path" | nc domain.tld 80
-e
引数をエコーにドロップして、最後にエスケープされた改行を追加することもできます。 -e
は、エコーが自然に改行を追加する傾向を抑制しているため、自分で追加します。
編集1:ヘッダーのすべての可能性を処理して提供できるcurl
のような通常のダウンロードツールを使用していない理由がありますか有用な出力?ヘッダーチャットを自分で処理する必要がありますか? curl http://domain.tld/path
を使用すると、プログラマーがすべての可能性について既に取り組んでいるため、より信頼性の高い出力が得られます。
編集2:プロトコル仕様の詳細については、 Warren's answer を参照してください。 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
HTTP 1.1 必須 GETリクエストで少なくともHost
ヘッダーを送信すること。つまり、最小の法的要求は次のようになります。
GET http://www.example.com/noise/and/junk HTTP/1.1
Host: www.example.com
(もちろん、ヘッダーセクションを終了するための追加のCRLFもあります。)
HTTP 1.1が必要であると主張する要求に対処するHTTPサーバーが存在する場合がありますが、Host
ヘッダーは含まれていませんが、サーバーはそのような要求を拒否するのに適しています。
Host
は、名前ベースの仮想ホスティングをサポートするために必要なHTTP 1.1拡張です。アクセスしようとしているサイトに専用サーバー(または少なくとも専用IP)がある場合は、安全にHTTP 1.0に戻すことができます。これにより、単一行のHTTPリクエストを作成できます。
GET http://www.example.com/noise/and/junk HTTP/1.0