什么时候使用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。
好吧丹尼尔斯科特已经确定了我最初的困惑的来源。 我会记录一些对我来说不太清楚的点,并且阻止我正确理解这些规范:
另外我想说的是,我做了一个实验,确认了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