Skip to content
目录

<script>加载脚步可以修改请求头的referer吗

在 script 标签中加载的脚本是不可以修改请求头的 referer 字段的。在浏览器中,script 标签加载的资源是通过 GET 请求获取的,并且浏览器会自动添加 referer 字段,该字段的值为当前页面的地址,无法修改。

如果需要修改 referer 字段,可以考虑使用 XMLHttpRequest 对象发送 AJAX 请求,并手动设置请求头 referer 的值。例如:

javascript
var xhr = new XMLHttpRequest();
xhr.open('GET', '/api', true);
xhr.setRequestHeader('Referer', 'http://example.com');
xhr.onreadystatechange = function() {
  if (xhr.readyState === XMLHttpRequest.DONE) {
    // 处理响应在 readyState变为4(即请求已完成)时,可以获取响应数据并进行处理
  }
};
xhr.send();

需要注意的是,修改 referer 字段可能会引发安全问题,应慎重使用。

:authority:open.uino.com

":authority" 是 HTTP/2 中的一个伪头(pseudo-header),用于标识请求目标的权威名称。它表示请求的 URI 的 "Authority" 部分,通常是主机名和端口号。在 HTTP/1.1 中,这个值通常出现在 "Host" 请求头字段中,而在 HTTP/2 中,则使用 ":authority" 伪头字段。因此,":authority: open.uino.com" 表示请求的目标是 "open.uino.com" 这个主机,并且使用默认的端口号(80 或 443)。

:method :path :scheme呢

":method", ":path", 和 ":scheme" 都是 HTTP/2 中的伪头(pseudo-header),用于在请求和响应中传递关于请求方法、请求目标和协议方案的信息。

  • ":method" 表示请求使用的 HTTP 方法,例如 GET、POST、PUT 等。该字段值对应于 HTTP/1.x 的请求行中的请求方法字段。
  • ":path" 表示请求的目标 URI 的路径和查询字符串,不包括协议、主机名和端口号。该字段值对应于 HTTP/1.x 的请求行中的请求 URI 字段。
  • ":scheme" 表示请求使用的协议方案,例如 "http" 或 "https"。该字段值对应于 HTTP/1.x 的请求行中的协议字段。

在 HTTP/2 中,这些伪头字段不再出现在请求和响应的正文中,而是作为帧头的一部分传输。这样做的目的是为了提高性能,减少了请求和响应的数据量和延迟。

什么是伪头,为什么要有伪头

伪头(pseudo-header)是 HTTP/2 协议中引入的一种特殊的头部字段。伪头字段以 ":" 开头,用于传输与请求或响应本身相关的元数据信息。HTTP/2 规范定义了一些特定的伪头字段,包括:

  • :method - 请求方法
  • :scheme - 协议方案(如 "http" 或 "https")
  • :authority - 请求的主机名和端口号
  • :path - 请求的路径和查询字符串

这些伪头字段不像普通的 HTTP 头部字段一样在请求或响应的消息体中出现,而是作为帧头的一部分在 HTTP/2 连接中传输。这种设计可以减少请求和响应的头部信息的大小和传输延迟,提高传输效率和性能。

伪头字段在 HTTP/2 中有重要作用,例如可以帮助服务器快速地解析和处理请求,同时也可以帮助客户端构造有效的请求。但需要注意的是,伪头字段只在 HTTP/2 协议中存在,在 HTTP/1.x 协议中并没有这些概念。

图解伪头在整个帧中的位置

下图展示了 HTTP/2 协议中帧(Frame)的结构,伪头字段出现在了帧头(Frame Header)中:

javascript
+-----------------------------------------------+
|                 Frame Header                  |
+-----------------------------------------------+
|                Header Block Fragment          |
+-----------------------------------------------+
|                    Padding                    |
+-----------------------------------------------+

帧头由 9 个字节组成,包括以下字段:

  • Length:占 24 位,表示整个帧的长度(不包括帧头)。因为 HTTP/2 采用二进制协议,所以长度以字节为单位。
  • Type:占 8 位,表示帧的类型。HTTP/2 定义了 10 种不同类型的帧,例如数据帧(DATA)、头部帧(HEADERS)、优先级帧(PRIORITY)等。
  • Flags:占 8 位,表示帧的标志位。标志位可以用来传输一些附加信息,例如数据帧的 END_STREAM 标志表示该帧是最后一个数据帧。
  • Stream Identifier:占 31 位,表示帧所属的流的标识符。HTTP/2 中的所有帧都必须与一个流相关联,流可以看作是一组相互关联的帧的序列。流标识符可以用于将帧路由到正确的流中。

在头部帧(HEADERS)中,伪头字段(例如 :method、:scheme、:path、:authority)会出现在帧头的 Payload 部分中,其他 HTTP 头部字段则出现在帧头后的 Header Block Fragment 和 Padding 中。由于伪头字段具有特殊的作用和语法规则,因此它们需要出现在帧头的 Payload 中,并且需要严格按照规范进行编码和解码。

给出头部帧,数据帧,帧头,头部帧的Payload 的层级关系

在 HTTP/2 协议中,数据传输的基本单位是帧(frame)。帧分为头部帧和数据帧两种类型。

  • 帧头(Frame Header):帧头包含了帧的基本信息,如帧类型、帧长度、标志等。
  • 头部帧(Headers Frame):头部帧用于传输 HTTP 头部信息。
    • 头部帧的 Payload(Header Payload):头部帧的 Payload 是 HTTP 头部信息的二进制表示。
  • 数据帧(Data Frame):数据帧用于传输请求体和响应体的实际数据。

下面是头部帧、数据帧、帧头和 Payload 的层级关系:

javascript
在 HTTP/2 中,头部帧和数据帧共同组成了完整的 HTTP 报文。客户端和服务器通过多个流(Stream)来交换 HTTP 报文,每个流都有一个唯一的标识符,并且可以包含多个头部帧和数据帧。HTTP/2 协议中定义了多种类型的帧,例如优先级帧(PRIORITY Frame)、重置帧(RST_STREAM Frame)等,它们都是为了支持更高效的数据传输而设计的。

    +-----------------------------------------------+
    |               Headers Frame 头部帧             |
    +---------------+---------------+---------------+
    |    Length 24  |   Type (8)    |   Flags (8)   |
    +---------------+---------------+---------------+
    |                Stream Identifier (31)         |//帧头(Frame Header)是 HTTP/2 协议中定义的一种固定长度的帧头部分,由 9 个字节组成,包含了一些关键信息,如帧长度、帧类型、标志位和所属的流标识符等。
    +---------------+-------------------------------+
    |                 Header Payload                | //HTTP 头部的二进制表示, 每个头部帧都包含了 HTTP 报文头部的全部信息
    +---------------+-------------------------------+

 Header Payload:
	头部数据(Header Block Fragment):在 HTTP/2 中,头部信息可以被分成多个片段(Fragment),每个片段都有自己的长度和标志位。头部数据可能包含 HTTP 报文的普通头部字段、伪头字段和其他自定义的头部字段。
	填充数据(Padding):是可选的,可以用来填充帧的 Payload 部分,以使帧达到指定的长度。填充数据的长度由帧头的 Padding Length 字段指定。


    +-----------------------------------------------+
    |                 Data Frame 数据帧              |
    +---------------+---------------+---------------+
    |    Length 24  |   Type (8)    |   Flags (8)   |
    +---------------+---------------+---------------+
    |                Stream Identifier (31)         |//帧头(Frame Header)是 HTTP/2 协议中定义的一种固定长度的帧头部分,由 9 个字节组成,包含了一些关键信息,如帧长度、帧类型、标志位和所属的流标识符等。
    +---------------+-------------------------------+
    |                   Data Payload                |//请求体或响应体的实际数据
    +-----------------------------------------------+

从上面的结构可以看出,HTTP/2 帧由帧头和帧负载两部分组成,其中帧头又包含了长度、类型、标志和流标识等信息。头部帧的负载是 HTTP 头部的二进制表示,数据帧的负载则是请求体或响应体的实际数据。在 HTTP/2 中,头部帧和数据帧的长度是动态计算的,不再像 HTTP/1.x 那样有固定的大小限制。

帧头Frame Header

帧头(Frame Header)是 HTTP/2 协议中定义的一种固定长度的帧头部分,由 9 个字节组成。帧头部分包含了以下信息:

  • 长度(Length):占用 24 位,指定了帧的长度,不包括帧头的 9 个字节。
  • 类型(Type):占用 8 位,指定了帧的类型,如 HEADERS Frame、DATA Frame 等。
  • 标志位(Flags):占用 8 位,指定了帧的一些特殊标志,例如是否带有填充数据、是否需要压缩等。
  • 流标识符(Stream Identifier):占用 31 位,指定了帧所属的流的标识符。
本站总访问量 次 本站访客数 人次

1111111111111111111