如何使用IP地址形成GET HTTP请求

3

当我在C语言中使用以下GET HTTP请求时,我一直收到400 Bad Request的错误提示,但是当我使用字符串形式的IP地址(例如:www.wwe.com/index.php)时,它可以正常工作:

GET %s HTTP/1.0\r\nHost: %s\r\nConnection: Keep-Alive\r\n\r\n

在GET后的%s将被替换为类似以下内容:http://54.236.192.188/index.php,而Host值则由hostent结构中的h_name字符串值提供。
因此,请求看起来像这样:
GET http://54.236.192.188/index.php HTTP/1.0
Host: ec2-54-236-192-188.compute-1.amazonaws.com
Connection: Keep-Alive

这里我做错了什么?

我不明白,请问您能否在构建后将请求的样子发布出来? - Iharob Al Asimi
@iharob 我已经更新了代码,展示了在传入IP后GET请求的样子。 - Vimzy
1个回答

6
GET请求的参数应该只是资源路径本身,而Host头应该是原始URL指定的请求发送到的机器的域名/主机。
要请求http://www.wwe.com/index.phpGET请求应该像这样:
GET /index.php HTTP/1.1
Host: www.wwe.com
...

为了请求 http://54.236.192.188/index.phpGET 请求应该如下所示:
GET /index.php HTTP/1.1
Host: 54.236.192.188
...

然而,如果服务器在同一个IP地址上运行多个网站,则不能在请求中提供IP地址。 Host 标头告诉服务器访问哪个特定的网站。

除非必要,应该使用HTTP/1.1而不是HTTP/1.0。例如,默认情况下HTTP/1.0不支持Keep-Alive。而且Host标头对于HTTP 1.1是必需的。


在向HTTP代理发送请求时,在请求行中指定绝对URL是有效的。 - Remy Lebeau
@RemyLebeau 所以,指定一个带有 IP 地址的 URL 是有效的吗?就像我描述的问题一样? - Vimzy
@RemyLebeau - 只能代理吗,还是一般也可以对Web服务器进行操作?我不知道这一点,我会有一天测试一下。 - Danny_ds
@Vimzy:Host 头部的值来自 URL 的主机部分,而不是 DNS 查询。你为什么还要使用 hostent - Remy Lebeau
@RemyLebeau 我正在使用它来收集信息以填充sockaddr_in结构。所以这里有两个问题:1.当我运行请求时,我不能直接给出IP地址,对吧?2.主机头值应该简单地从传入的URL中派生出来(www.wwe.com/index.php --> www.wwe.com),对吧? - Vimzy
显示剩余5条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接