在发出相对请求时从哪里获取HOST头?

时间:2015-08-13 07:59:10

标签: html http httprequest fiddler

根据SPEC

  

最常见的Request-URI形式是用于标识a的   源服务器或网关上的资源。在这种情况下绝对   URI的路径必须作为传输   Request-URI和URI的网络位置(权限)必须   在主机标题字段中传输。
  例如,希望的客户   直接从源服务器检索上面的资源   创建到主机端口80的TCP连接" www.w3.org"并且寄出   这些行:

   GET /pub/WWW/TheProject.html HTTP/1.1
   Host: www.w3.org

因此,当用户发出此请求时,会收到回复。

现在好了,这个周期 over(!) - 用户点击<a href="/help">Help</a>链接。

  • 请注意,地址是相对的。

  • 另请注意 - form (!)的基本网址为action(&#34; www.w3.org/help& #34;)。

Example (look in the iframe's view source)

http://i.imgur.com/uChSE6Q.png

  • 另请注意 - 没有代表基本网址的<base>标记

确定。那么问题是什么?

问题

如果用户点击超链接,浏览器如何知道要转到的host值? AFAIK不是来自地址栏网址。

我知道document.location包含所有信息但仍然 - 我不认为此处涉及JS

知道上一个周期(请求)已经结束(第一个请求) - 当现在发出相对请求时,host标头值取自何处?

非常感谢 SPEC 参考。

修改

I've been investigating it与Fiddler:

所以这个html:

<body>
  <a href="/GetSomething"> Click me</a>
</body>

Fiddler展示了这个结果:

GET http://null.jsbin.com/GetSomething HTTP/1.1
Host: null.jsbin.com
Connection: keep-alive
Pragma: no-cache
Cache-Control: no-cache
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8
Upgrade-Insecure-Requests: 1
User-Agent: Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/44.0.2403.155 Safari/537.36
DNT: 1
Referer: http://null.jsbin.com/runner
Accept-Encoding: gzip, deflate, sdch
Accept-Language: en-US,en;q=0.8,he;q=0.6
Cookie: _ga=GA1.2.474312101.1437654587; _gat=1; jsbin=s%3A...

网址是完整的网址(显然):

http://null.jsbin.com/GetSomething

问题可能是一个非常简单的问题,但仍然 - BASE网址从哪里来? (Javascript(document.location?)?地址栏url?浏览器内部的一些内部存储?)

2 个答案:

答案 0 :(得分:1)

它取自表格所包含的文件的基本URI。

(顺便说一下:你看的是一个绝对的规范;相关的是RFC 7230)。

答案 1 :(得分:1)

http://www.w3.org/TR/html401/struct/links.html#edef-BASE

&#34; 12.4.1解析相对URI

用户代理必须根据[RFC1808]第3部分计算用于解析相对URI的基URI。以下内容描述了[RFC1808]如何专门应用于HTML。

用户代理必须根据以下优先级(最高优先级到最低优先级)计算基URI:

  1. 基本URI由BASE元素设置。
  2. 基URI由协议期间发现的元数据给出 交互,例如HTTP标头(请参阅[RFC2616])。
  3.   
        
    1. 默认情况下,基URI是当前文档的URI。不是全部   HTML文档具有基URI(例如,有效的HTML文档可以   出现在电子邮件中,可能不会由URI指定)。这样的HTML   如果文档包含相对URI,则认为它们是错误的   依赖于默认的基本URI。
    2.   

    &#34;

    www.anotherebsite.com/action_page.php中定义的

    <a href=""/>被称为浏览器的相对链接。 因此,点击浏览器并不会更新它发送请求的主机。

    http://www.anotherebsite.com/action_page.php是浏览器的远程地址,在点击时更新主机并将客户端导航到远程地址。

    用户代理是连接到服务器以从客户端发送和接收请求的浏览器或应用程序。用户代理的示例是Firefox,IE,Chrome等浏览器。 每当用户代理/浏览器想要显示特定页面时,它就向服务器发送请求该内容的请求。并且服务器以(通常)的方式响应。服务器将请求的数据作为文本发送到浏览器的ip,并通过路由器等导航到客户端。在接收文本时,浏览器根据用户界面的HTML更改标记。

    浏览器设计为具有本地存储空间缓存,用于存储您访问的链接,信息和其他数据,如表单数据,窗口内容,密码和历史记录等。

    GET http://null.jsbin.com/GetSomething HTTP/1.1
    Host: null.jsbin.com
    

    在这里浏览器请求主机(null.jsbin.com)发送(GetSomething) 数据被发送到&#34; null.jsbin.com&#34;要求&#34; GetSomething&#34;

    服务器通过以下

    识别浏览器
    • Cookie(存储在客户端,以后可以检索)
    • IP地址
    • 浏览器指纹识别

    这是一种检查网络服务器https://panopticlick.eff.org/index.php?action=log&js=yes可以从浏览器中检索哪些数据的方法。该数据可用于浏览器指纹识别,以通过服务器识别浏览器。

    由于网络模型表示持久性(连接可能不是真正持久的,因为页面已经加载,但是作为上面提到的IP地址和其他标识符,服务器知道在同一会话期间它是相同的浏览器/用户代理)通过会话层在客户端和服务器之间管理连接。服务器通过握手时获取的数据了解其客户端。然后它可以知道彻底实例化每个客户端的会话ID,也可以通过客户端记住的cookie