HTTP 请求行、Host字段信息版本总结

最近查了一些请求行URI和Host字段的资料。

HTTP请求的请求行包括

  方法(METHOD)

  请求URI(Request-URI)

  协议版本(HTTP-Version)

其中请求URI在HTTP1.1中被命名为请求目标(request-target)。似乎是因为HTTP1.1协议新增方法请求的对象不仅限于URI了,为了方便讨论,下面我们将请求行第二项均称为请求URI。

请求URI在不同版本协议中定义不同


HTTP 1.0协议中请求URI有两种[1]
  1.绝对URI(absoluteURI):形式类似于protocol://host[:port]/uri在 1.0协议中,绝对路径只允许在发给代理的请求中使用。
  2.绝对路径(abs_path):形式类似于的/uri
HTTP 1.0协议中没有host字段。是通过TCP连接标识主机的。

HTTP1.1协议中请求URI有4种[2]
  1.绝对URI(absolute-form):类似HTTP1.0。区别是在不再只用于发送给代理的请求,但是在代理请求中必须使用绝对URI(CONNECT、OPTIONS方法除外)。
  2.绝对路径(origin-form):类似于之前提到的/uri
  3.认证格式(authority-form):仅在CONNECT方法中可用,格式为[ userinfo "@" ] host [ ":" port ] 其中userinfo包含用户名/密码等信息。
  4.星号格式(asterisk-form):仅在OPTIONS方法中可用。格式为"*",表示对服务器发送OPTIONS请求。

在HTTP1.1中需要将协议、host、URI组合成“有效URI”(Effective Request URI),然后才能得到客户端请求的资源

主要规则如下[2]
  1.请求URI如果是绝对URI,直接将绝对URI作为“有效URI“。
  2.当OPTIONS请求通过代理时,如果没有指定请求资源(/uri),在代理链的最后一个节点应该将请求URI改为星号形式。
  3.当请求URI不是绝对URI时,Host的优先级为 服务器配置->请求URI中host->请求头host字段->服务器默认host。
  4.当请求URI不是绝对URI时,Port的优先级为 服务器配置->TCP连接port->请求头host字段。
  5.协议中要求浏览器(user agent)发送的请求URL中包含host、port信息和Host字段中的信息应该一致。

当请求URI中和Host字段主机名冲突时,比如:

GET http://www.baidu.com/ HTTP/1.1

Host: www.google.com

 

nginx将按照规则1.直接使用URI中的主机名,忽略掉后边的Host字段信息。

事实上这种请求并不合法[2],但协议中并没有规定如何处理,返回403也是可以的[3]


参考文档:

[1]https://www.w3.org/Protocols/rfc1945/rfc1945

[2]https://tools.ietf.org/rfc/rfc7230.txt

[3] https://softwareengineering.stackexchange.com/questions/298130/how-should-an-http-server-respond-to-a-get-of-an-absolute-uri-of-a-different-ser/298131#298131

转载于:https://www.cnblogs.com/PProtector/p/10725919.html

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值