gpt4 book ai didi

sockets - C编程-发送HTTP请求

转载 作者:行者123 更新时间:2023-12-02 15:30:02 25 4
gpt4 key购买 nike

我最近的任务是使用套接字编程在C中创建代理。代理仅需要使用HTTP/1.0构建。经过几个小时的工作,我制作了可以与Chromium一起使用的代理。可以加载各种网站,例如google和几个.edu网站;但是,许多网站给我一个404错误,提示找不到页面(这些链接在不通过我的代理服务器时工作正常)。这些404错误甚至发生在站点的根地址“/”上……这是没有意义的。

这可能是我的HTTP请求出现问题吗?将从浏览器发送的HTTP请求解析为HTTP请求方法,主机名和端口。例如,如果从浏览器解析了GET请求,则将建立与所提供的主机名和端口的TCP连接,并以以下格式发送HTTP GET请求:

GET /path/name/item.html HTTP/1.0\r\n\r\n

这种格式适用于少量网站,但其余网站会创建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

通过它,它查看 方案,它是 http,因此它知道它正在建立HTTP连接。下一部分是 主机名。在原始HTTP下,假定每个主机名都解析为其自己的IP地址,然后客户端连接到该IP地址并发出请求。由于当时每个服务器只有一个网站,因此可以正常工作。

但是,随着网站数量的增加,给每个网站分配不同的IP地址变得很困难,尤其是因为许多网站是如此简单,以至于它们可以轻松地在同一台物理计算机上共享。将多个域指向相同的IP地址很容易(DNS系统使这一操作非常简单),但是当服务器收到TCP请求时,它只会知道它对其IP地址有一个请求-它不知道哪个网站发回。因此,添加了新的 Host header ,以便客户端可以在请求本身中指示其请求的主机名。这意味着一台服务器可以托管许多网站,并且该网络服务器可以使用 Host header 来确定响应中应该服务哪个网站。

如今,这很常见-如果您不使用 Host header ,那么许多网站将不知道您要的服务器。通常发生的情况是,他们假设他们从列表中获得一些默认网站,并且很可能该网站没有您要的文件。即使您要求 /,如果您不提供 Host header ,那么无论如何,Web服务器都可能会给您404,如果它是通过这种方式配置的-如果没有明智的默认网站提供,这也不是没有道理的你。

如果需要更多技术细节,可以在 the HTTP RFC中找到 Host header 的描述。

另外,网站可能只是拒绝HTTP/1.0-如果在很多网站上发生这种情况,我会感到有些惊讶,但您永远不会知道。不过,请先尝试 Host header 。

与某些人认为的相反,没有什么可以阻止您在HTTP/1.0中使用 Host header ,尽管您可能仍然会发现一些不喜欢它的服务器。这比支持完整的HTTP/1.1稍微容易一些,它要求您了解分块的编码和其他复杂性,尽管对于简单的示例代码,您可能只需要添加 Host header 并将其命名为HTTP/1.1(我不建议这样做)就可以了。但是,这足以满足生产代码要求)。

无论如何,您可以尝试添加 Host header ,使您的请求像这样:
GET /path/name/item.html HTTP/1.0\r\n
Host: www.example.com\r\n
\r\n

为了方便阅读,我将其分成几行-您可以看到结尾处仍然有空白行。

即使这没有引起您所看到的问题,但如今 Host header 确实是一个好主意,因为肯定有一些网站如果没有它就无法工作。如果您仍然遇到问题,他们会给我一个不适合您的网站示例,我们可以尝试找出原因。

如果我说的话不清楚或需要更多细节,请问。

关于sockets - C编程-发送HTTP请求,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14330553/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com