Sta*_*uff 2 sockets rfc httprequest
我最近的任务是使用套接字编程在C中创建代理.代理只需要使用HTTP/1.0构建.经过几个小时的工作,我已经制作了一个可以与Chromium一起使用的代理.可以加载各种网站,如谷歌和几个.edu网站; 然而,许多网站给我一个404错误的页面未找到(这些链接在不通过我的代理时工作正常).这些404错误甚至发生在站点的根地址"/"上......这没有意义.
这可能是我的HTTP请求有问题吗?从浏览器发送的HTTP请求将针对HTTP请求方法,主机名和端口进行解析.例如,如果从浏览器解析GET请求,则会为提供的主机名和端口建立TCP连接,并以下列格式发送HTTP GET请求:
GET /path/name/item.html HTTP/1.0\r\n\r\n
Run Code Online (Sandbox Code Playgroud)
此格式适用于少量网站,但会为其余网站创建404错误消息.这可能是问题吗?如果没有,还有什么可能给我这个问题?
任何帮助将不胜感激.
一个可能的解释是你设计了一个HTTP/1.0代理,而共享主机站点上的任何网站现在只能用于HTTP/1.1(好吧,不是很好,但我会在一秒钟内完成).
从长远来看,这不是唯一可能出现的问题,但你必须举一个像这样失败的网站的例子来获得更多的想法.
您似乎理解HTTP的基础知识,即客户端与服务器建立TCP连接并通过它发送HTTP请求,该请求由请求行(例如GET /path/name/item.html HTTP/1.0)和一组可选标题行组成,所有标题行均由CRLF分隔(即\r\n).整个批次以两个连续的CRLF序列结束,此时另一端的服务器将请求与资源匹配并发回适当的响应.资源都由路径(例如/path/name/item.html)标识,该路径可以是真实文件,或者它可以是动态页面.
自从它首次发明以来,大部分HTTP都保持不变.但是,请考虑客户端如何找到要连接的服务器.你给它的是一个URL,如下所示:
http://www.example.com/path/name/item.html
Run Code Online (Sandbox Code Playgroud)
从这一点看的方案是http,所以它知道它使一个HTTP连接.下一部分是主机名.在原始HTTP下,假设每个主机名解析为其自己的IP地址,然后客户端连接到该IP地址并发出请求.由于当时每个服务器只有一个网站,所以工作正常.
然而,随着网站数量的增加,很难为每个网站提供不同的IP地址,特别是因为许多网站非常简单,以至于可以在同一台物理机上轻松共享.很容易将多个域指向同一个IP地址(DNS系统使这非常简单),但是当服务器收到TCP请求时,它只知道它有对其IP地址的请求 - 它不知道哪个网站送回.因此,Host添加了一个新标头,以便客户端可以在请求中指明它正在请求哪个主机名.这意味着一台服务器可以托管许多网站,网络服务器可以使用Host标头来告知响应中的哪一个服务器.
这些天很常见 - 如果你不使用Host标题,那么许多网站都不会知道你要求的服务器.通常发生的是他们从他们所拥有的列表中假设一些默认网站,并且可能没有你要求的文件.即使你要求/,如果你没有提供Host标题,那么网络服务器可能会给你一个404,如果它是这样配置的 - 如果没有合理的默认网站给你,这是不合理的.
如果需要更多技术细节Host,可以在HTTP RFC中找到标头的描述.
此外,网站可能只是简单地拒绝HTTP/1.0 - 如果发生在很多网站上,我会有点惊讶,但你永远不会知道.不过,Host首先尝试标题.
与某些人认为没有什么可以阻止你使用HostHTTP/1.0 的标头相反,尽管你可能仍然会发现一些不喜欢它的服务器.它比支持完整的HTTP/1.1要容易一些,这要求你理解分块编码和其他复杂性,尽管对于简单的示例代码,你可能只需添加Host标头并将其称为HTTP/1.1(我不建议这样做).但是,对于生产代码来说已经足够了.
无论如何,你可以尝试添加Host标题来提出你的请求:
GET /path/name/item.html HTTP/1.0\r\n
Host: www.example.com\r\n
\r\n
Run Code Online (Sandbox Code Playgroud)
为了方便阅读,我把它分成了几行 - 你可以看到最后还有空白行.
即使这不会导致你所看到的问题,Host这些天的标题是一个非常好的主意,因为如果没有它,肯定会有网站无法运行.如果您仍然遇到问题,请告诉我一个不适合您的网站示例,我们可以尝试找出原因.
如果我说的不清楚或需要更多细节,请问.
| 归档时间: |
|
| 查看次数: |
6490 次 |
| 最近记录: |