「HTTP」- 头部字段 | 学习笔记

Header 信息包含的 Response Header 和 Entity Header 详细,具体字段可以参考 RFC2916,这里不再详细列举;

常用请求头部字段 | Request Header

Accept:客户端可接受的 MIME 类型
Accept-Encoding:客户端能够进行解码的数据编码方式,比如 gzip
Accept-Language:客户端所希望的语言种类,当服务器能够提供一种以上的语言版本时需要
Authorization:授权信息,通常出现在对服务器发送的 WWW-Authenticate 头的应答中
Content-Type:表示数据属于什么 MIME 类型。默认为 text/plain 纯文本格式
Content-Length:表示请求消息正文的长度
Host:客户端要访问的主机名
Referer:客户端通过该字段表示自己从哪个资源来访问服务器的,该字段包含一个 URL,表示从该 URL 代表的页面出发访问当前请求的页面
User-Agent:该字段包含发出请求的用户信息,客户端类型
Cookie:用于客户端保存服务器返回的数据,通常保存用户身份信息
Connection:表示处理完该次请求后是否断开连接

常见响应头部字段 | Response Header

Allow:服务器支持哪些请求方法(如 GET、POST 等)
Content-Encoding:文档的编码(Encode)方法。只有在解码之后,才可以得到 Content-Type 头指定的内容类型

Content-Encoding: gzip | 表示资源通过 gzip 压缩,客户端将解压后才能得到内容 |
How to know if a site is gzipped?

Content-Length:表示内容长度。只有当客户端使用持久 HTTP 连接时才需要该字段

Content-Type:表示数据属于什么 MIME 类型。默认为 text/plain 纯文本格式

Date:当前的 GMT 时间

Location:该字段配合 302 状态码使用,用于重定向到一个新 URI 地址。表示客户端应当去寻找并提取资源的位置

Server:表示服务器的类型

Set-Cookie:设置和页面关联的 Cookie

Transfer-Encoding:数据的传送格式

WWW-Authenticate:表示客户应该在 Authorization 头中提供什么类型的授权信息,在包含 401(Unauthorized)状态行的应答中这个字段是必需的

设置 HTTP 响应头往往和状态码结合起来。例如,表示“位置已经改变”的状态代码通常伴随着一个 Location 头,而 401(Unauthorized)状态代码则必须伴随一个 WWW-Authenticate 头。响应头可以用来完成:设置 Cookie,指定日期,指示客户端按照指定的间隔刷新页面等等;

HTTP Header Fields

List of HTTP header fields – Wikipedia

User-Agent

用户代理列表:Access-Control-XXX

If you see this message it means the response failed yet you are still able to see the returned data if you go to the Network tab — what’s the idea here?[1]

[1]. Understanding CORS
Wikipedia/Cross-origin resource sharing

Content-Type

Setting the HTTP charset parameter
List of HTTP header fields

字段含义:请求(通常为 POST 与 PUT 方法)体内数据类型;

示例:Content-Type: text/html; charset=utf-8;
解释:请求内容为 HTML 文本,并且内容为 UTF-8 编码;

Content-Security-Policy

asp.net – X-Frame-Options Allow-From multiple domains – Stack Overflow

HTTP Header 要返回 Content-Security-Policy 以允许 iframe 嵌套;

补充说明

HTTP1.0 对于每个连接都只能传送一个请求和响应,请求就会关闭;
HTTP1.0 没有 Host 字段,而 HTTP1.1 在同一个连接中可以传送多个请求和响应,多个请求可以同时进行;

WWW-Authenticate 是早期的一种简单的,有效的用户身份认证技术;

浏览器显示的内容包括 HTML、XML、GIF、Flash 等,浏览器通过 MIME Type 进行区分;

更多详细信息请参考 RFC HTTP1.1 标准,https://www.ietf.org/rfc/rfc2616.html

Content-Disposition

PHP 附件下载中文名称乱码的解决方法

浏览器下载文件,如果文件名中包含的中文则会显示为乱码。

此时就需要对文件名进行编码,也就是说先进性 urlencode,然后再放入 header,然后问题就解决了。

$filename = urlencode(“下载文档”);
header ( “Content-disposition: attachment; filename=$filename.xls” );

网上说,在 RFC2231 的定义里面,多语言编码的 Content-Disposition 应该这么定义:
代码如下:

Content-Disposition: attachment; filename*=”utf8”%E6%B5%8B%E8%AF%95.html”

即:

filename 后面的等号之前要加 *
filename 的值用单引号分成三段,分别是字符集(utf8)、语言(空)和 urlencode 过的文件名。

所以这时应该对文件名进行 url 编码转换,使用 php 的 urlencode 很轻松就搞定了

<?php
/**
 * 下载时,如果文件名中包含【中文】,在部分浏览器中会显示乱码
 * 主要是因为浏览器 Content-Disposition 头的实现不相同。
 * 参阅 RFC2231
 * @param type $fileName
 */
private function getCompatibleContentDisposition($fileName) {

    $userAgent = $_SERVER["HTTP_USER_AGENT"];

    if (preg_match("/MSIE/", $userAgent)) {

        $encoded_filename = str_replace("+", "%20", urlencode($fileName));
        return "Content-Disposition: attachment; filename=\"{$encoded_filename}\"";
    } else if (preg_match("/Firefox/", $userAgent)) {

        return "Content-Disposition: attachment; filename*=\"utf8''{$fileName}\"";
    }

    return 'Content-Disposition: attachment; filename="' . $fileName . '"';
}

代理有关的头部 | Proxy-Related Headers

List of HTTP header fields
HTTP “X-” Headers
Is sending “X-Real-IP” and “X-Forwarded-For” necessary for an Nginx cache running on LAN? – Server Fault

在配置 Nginx 反向代理时,我们经常被 X-REAL-IP、X-Forwarded-For 等等头部,搞得晕头转向。再比如,在多层反向代理环境中,传递客户端真实网络地址的问题。

该笔记将记录:学习与 HTTP 反向代理有关的头部。

Forwarded

透露“通过代理连接服务器的”客户端的原始信息。

例如:Forwarded: for=192.0.2.60;proto=http;by=203.0.113.43

X-Forwarded-For

标识“通过代理或者负载均衡连接到服务器的”客户端原始网络地址。(被 Forwarded 标头取代,但依旧在使用)

例如:X-Forwarded-For: client1, proxy1, proxy2 / X-Forwarded-For: 129.78.138.66, 129.78.64.103

X-Forwarded-Host

标识客户端请求的原始主机(头部 Host 字段)。因为代理或者负载均衡可能使用不同的主机,比如多级代理转发。(被 Forwarded 标头取代,但依旧在使用)

例如:X-Forwarded-Host: en.wikipedia.org:8080 / X-Forwarded-Host: en.wikipedia.org

X-Forwarded-Proto

标识客户端请求的原始协议,因为代理服务器可能用 HTTP 请求目标服务器,即使原始请求使用 HTTPS 协议。(被 Forwarded 标头取代,但依旧在使用)

例如:X-Forwarded-Proto: https

Max-Forwards

限制消息可通过代理转发的最大次数。

例如:Max-Forwards: 10

X-REAL-IP

在 RFC 中,我们没有看到 X-REAL-IP 头部的说明,但是其他文档中提到,该字段记录客户端的真实网络地址。

例如:X-Real-IP: 192.168.0.10

附加说明

客户端能够随意构建这些请求头的信息。如果客户端使用虚假的 X-Forwarded-For 等头部,并且服务端没有严格检查,则完全能够绕过网络地址限制,以任意设置客户端地址。