什么时候使用http请求规格中的absoluteUri?

我一直在寻找具有getRequestURI和getRequestURL方法的HttpServletRequest API(Java)。 这让我看看:https://tools.ietf.org/html/rfc7230#section-5.3据我所知,getRequestURI从http请求的第一行返回值,这是大多数时间相对于资源的相对路径除非原始服务器位于入站代理后面,在这种情况下,它必须是绝对URI。 我想大多数互联网上流行网站的原始服务器都属于这个类别,这意味着原始http请求中的URI应该是绝对URI(来自http规范),但我还没有设法在任何地方找到这样的例子。 浏览器真的可以知道它是否将其请求发送到入站代理或直接发送到原始服务器? http规范中的absoluteUri概念有没有实际价值? 因为Host头字段总是在HTTP 1.1请求中发送。 在没有Host头字段的情况下,规范的那部分是否在HTTP 1.0时代有一些实际价值?


我想你可能会对正在讨论的代理类型感到困惑。 它看起来像RFC是指一个转发代理,您通过另一个服务器向另一个服务器发送请求(并且客户端告诉代理将流量转发到哪里)。

使用反向代理,您是对的,客户端不知道请求已经被代理到另一台服务器。

代理服务器和反向代理服务器之间的区别


来自http协议1.0规范

只有在向代理发出请求时才允许使用absoluteURI表单 请求代理转发请求并返回响应。 如果请求是GET或HEAD并且先前的响应被高速缓存,则代理可以使用缓存的消息(如果它在Expires头字段中通过任何限制)。 请注意,代理可以将请求转发到另一个代理或直接转发到由absoluteURI指定的服务器。 为了避免请求循环,代理必须能够识别其所有服务器名称,包括任何别名,本地变体和数字IP地址。 示例请求行可以是: GET /TheProject.html HTTP/1.0

Request-URI 最常见的形式是用于标识源服务器或网关上的资源。 在这种情况下,只传送URI的绝对路径 (参见第3.2.1节,abs_path)。 例如,希望直接从源服务器检索上述资源的客户端将创建到主机“www.w3.org”的端口80的TCP连接并发送以下行:GET /pub/WWW/TheProject.html HTTP / 1.0,然后是完整请求的其余部分。 请注意,绝对路径不能为空; 如果原始URI中不存在,则必须以“/”(服务器根目录)的形式给出。

所以是的,在所有这些方面都有实际意义,但前提是您知道您实际上发布了代理。 浏览器无法真正知道他将信息提交给代理服务器,但由于这是最常见的情况,因此您总是会传输主机和uri属性,而不是显式路径。 现代(而不是现代)的代理从主机,协议,端口加上URI来重建URL

以下面的例子为例

GET /standards/ HTTP/1.1
Host: www.w3.org
User-Agent: Mozilla/5.0 (Windows NT 6.1; WOW64; rv:49.0) Gecko/20100101 Firefox/49.0
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
Accept-Language: en-US,en;q=0.5
Accept-Encoding: gzip, deflate, br
Referer: https://www.w3.org/
Connection: keep-alive
Upgrade-Insecure-Requests: 1

代理将重建客户端用于发出请求的URL。 返回的URL将包含协议,服务器名称,端口号和服务器路径。

在Java类似的事情完成了。 如果你看看servletapi规范,你会看到同样的行为。

因此,作为一个经验法则,绝对URI格式只有在向代理发出请求时才被允许。 该请求不一定来自浏览器,但是如果代理没有收到绝对路径,它会使用头中的其余数据构造URL,类似于java的getURL。


好吧丹尼尔斯科特已经确定了我最初的困惑的来源。 我会记录一些对我来说不太清楚的点,并且阻止我正确理解这些规范:

  • 正向代理通常简称为“代理”。
  • 反向代理通常被称为“网关”。
  • 出于某种原因,我认为转发代理与出站代理和反向代理是同义的入站代理的代名词。 我想我已经在一些关于代理的文章中看到过它,但我不知道这些术语是否被广泛使用。
  • 在TCP / IP级别,当我们在一个转发代理的后面时,所有的网络流量都被发送到该代理。 浏览器不会直接与原始服务器通信,而必须以某种方式将地址(IP或域名)发送到转发代理,以便代表客户端与源服务器进行通信。 这发生在请求行的HTTP协议级别上。 当我们不支持正向代理时,我们可以通过TCP / IP直接与原始服务器通信,并且不需要HTTP级别请求行中的绝对URL。
  • Request-Line中的绝对Url是从HTTP / 1.0时开始设计的,用于处理在正向代理之后进行通信的问题。 Host头字段是由HTTP / 1.1规范引入的一个强制性头文件,它通过它引入了对虚拟主机的支持。 我猜想HTTP / 1.1可能只是将绝对url强制为一致并且一箭双雕,但由于某种原因,它决定主机头解决方案更好。
  • 我意识到,除了正向和反向代理外,还有“透明”代理。 这些是ISP使用的CDN或代理,以及其他。 它们既不是正向也不是反向,并且不需要两个通信双方的配置。 他们与这个问题没有任何关系,但这曾经让我困惑。
  • 另外我想说的是,我做了一个实验,确认了http规范中的内容。

    我GOOGLE了“免费代理IP和端口”,去“https://www.hide-my-ip.com/proxylist.shtml”和配置窗口使用转发代理(控制面板 - > Internet选项 - >连接 - >局域网设置 - >“使用代理服务器...”)。 然后,我向www.bbc.com发出了一个请求,并检查了来自Chrome控制台网络选项卡的原始http请求,请求行中的地址是绝对的。 然后我删除了代理并再次提出了相同的请求。 请求线上的地址现在只是路径。

    我不确定Alexius Diakogiannos提到的代理人对url事情的整体重构。 看起来非常合乎逻辑的是,如果客户端没有发送绝对url,但是从我所能看到的至少chrome中,这是一个大多数转发代理都有的选项,当它意识到它在它后面时,将绝对url发送到代理。 当然,我从来没有管理/运行一个前锋代理,所以我不知道。

    链接地址: http://www.djcxy.com/p/96417.html

    上一篇: When is absoluteUri used from the http request specs?

    下一篇: HTTPS Proxy server in C#