HTTP标头对于控制缓存和浏览器如何处理您的内容很重要。 但是其中许多使用不正确或毫无意义,在页面加载的关键时刻花费了额外的资源,并且它们可能无法按照您的想法工作。 在一系列有关最佳做法的文章中,我们将首先介绍不必要的标题。
大多数开发人员都知道重要且有用的HTTP标头。 最著名的是
Content-Type
和
Content-Length
,它们几乎是通用标头。 但是最近,诸如
Content-Security-Policy
和
Strict-Transport-Security
类的标头已用于提高
Strict-Transport-Security
,而
Link rel=preload
可提高性能。 尽管浏览器广泛支持,但只有少数浏览器使用它们。
同时,有许多非常受欢迎的头条通常不是新手,也不是很有用。 我们可以借助
HTTP归档来证明这一点,
HTTP归档是由Google运行并由Fastly赞助的项目,该项目每月使用
WebPageTest下载500,000个站点并将结果上传到
BigQuery 。
根据HTTP存档,这是30个最流行的响应标头(基于每个标头显示的存档中的域数),并大致估算了它们的有用性:
标题 | 咨询处 | 域 | 现况 |
---|
日期 | 48779277 | 535621 | 需要协议 |
内容类型 | 47185627 | 533636 | 浏览器通常需要 |
伺服器 | 43057807 | 519663 | 选配 |
内容长度 | 42388435 | 519118 | 有用的 |
最后修改 | 34424562 | 480294 | 有用的 |
缓存控制 | 36490878 | 412943 | 有用的 |
标签 | 23620444 | 412370 | 有用的 |
内容编码 | 16194121 | 409159 | 压缩内容必需 |
过期 | 29869228 | 360311 | 选配 |
由x供电 | 4883204 | 211409 | 选配 |
语用 | 7641647 | 188784 | 选配 |
X帧选项 | 3670032 | 105846 | 选配 |
访问控制允许来源 | 11335681 | 103596 | 有用的 |
x内容类型选项 | 11071560 | 94590 | 有用的 |
连结 | 1212329 | 87475 | 有用的 |
年龄 | 7401415 | 59242 | 有用的 |
X缓存 | 5275343 | 56889 | 选配 |
x-xss保护 | 9773906 | 51810 | 有用的 |
严格运输安全 | 4259121 | 51283 | 有用的 |
通过 | 4020117 | 47102 | 选配 |
3 | 8282840 | 44308 | 选配 |
期望值 | 2685280 | 40465 | 有用的 |
内容语言 | 334081 | 37927 | 有争议的 |
x-aspnet版本 | 676128 | 33473 | 选配 |
访问控制允许凭证 | 2804382 | 30346 | 有用的 |
X机器人标签 | 179177 | 24911 | 对浏览器无关紧要 |
x-ua兼容 | 489056 | 24811 | 选配 |
访问控制允许方法 | 1626129 | 20791 | 有用的 |
访问控制允许标题 | 1205735 | 19120 | 有用的 |
让我们看一下可选的标头,为什么不需要它们以及如何处理。
虚荣(服务器,x-by-by,通过)
您可以为服务器软件的选择感到骄傲,但是大多数人对此并不满意。 在最坏的情况下,这些标头可能会泄露敏感数据,从而更容易攻击您的网站。
Server: apache
X-Powered-By: PHP/5.1.1
Via: 1.1 varnish, 1.1 squid
RFC7231允许您在服务器响应中包括Server标头,指示服务器上用于传递内容的特定软件。 通常,这是一个字符串,例如“ apache”或“ nginx”。 尽管标题是允许的,但标题是可选的,对开发人员或最终用户而言并不是特别有价值。 但是,今天它是Internet上第三大最受欢迎的HTTP服务器标头。
X-Powered-By
是最流行的标题,没有任何标准定义,并且具有类似的用途:它通常表示服务器在其上运行的应用程序平台。 最受欢迎的答案包括“ ASP.net”,“ PHP”和“ Express”。 同样,这并没有带来任何实际的利益,只是发生了。
也许可以通过
Via
考虑更多争议。 要求(
根据RFC7230 )将
请求通过的每个代理添加到请求中-标识代理。 这可能是代理主机名,但更常见的是通用标识符,例如“ vegur”,“ varnish”或“ squid”。 删除(或不添加)此类标头可能导致
代理转发周期 。 但有趣的是,它也响应浏览器的返回路径而添加-在这里,它仅执行信息功能:没有浏览器对其执行任何操作,因此可以安全地将其删除。
不推荐使用的标准(P3P,过期,X框架选项,X-UA兼容)
标题的另一类是实际上在浏览器中引起影响的标题,但是(已经)不是达到这种效果的最佳方法。
P3P: cp="this is not a p3p policy"
Expires: Thu, 01 Dec 1994 16:00:00 GMT
X-Frame-Options: SAMEORIGIN
X-UA-Compatible: IE=edge
P3P
是一件有趣的小事。 我不知道那是什么。 更有趣的是,P3P标头最常见的内容之一是“这不是P3P规则”。 好吧,是不是?
在这里,故事可以追溯到对
机器可读隐私规则进行标准化的尝试 。 关于如何在浏览器中显示数据存在分歧,只有一种浏览器实现了对该标头的支持-Internet Explorer。 但是即使在其中,P3P对用户也没有视觉效果。 他只需要在场即可允许访问框架中的第三方Cookie。 如上例所示,有些站点甚至设置了P3P不合规规则,尽管这样做存在
很大的问题 。
不用说,读取第三方cookie通常不是一个好主意,因此,如果您不这样做,则无需设置
P3P
标头!
考虑到
Cache-Control
在20多年来一直优于
Expires
,
Expires
简直
Expires
难以置信的受欢迎。 如果
Cache-Control
标头包含
max-age
指令,则将忽略同一响应中的所有
Expires
标头。 但是大量站点都设置了这两个标头,并且
Expires
最经常设置日期
Thu, 01 Dec 1994 16: 00: 00 GMT
,以便不缓存内容。 当然,
从规格中复制日期是最容易
的 。

但是根本没有必要这样做。 如果您有一个带有过去日期的
Expires
标头,只需将其替换为:
Cache-Control: no-store, private
(
no-store
是一个过于严格的指令,不能将内容写入持久性存储,因此您可能更喜欢使用
no-cache
以获得更好的性能,例如,在浏览器中向后/向前导航或恢复睡眠选项卡)
一些站点验证工具会建议您添加一个值为“ SAMEORIGIN”的
X-Frame-Options
标头。 它告诉浏览器您拒绝将内容发送到另一个站点上的框架:通常,这是防止
clickjacking的很好的防御措施。 但是,使用具有更一致的支持和更可靠行为的另一个标头可以实现相同的效果:
Content-Security-Policy: frame-ancestors 'self'
这里还有一个额外的好处,因为由于其他原因您仍然必须提供CSP标头(稍后会详细介绍)。 也许在我们这个时代,您可以不使用
X-Frame-Options
。
最后,回到IE9,Microsoft引入了一种“兼容模式”,该模式使用IE8或IE7引擎呈现页面。 即使在普通模式下,浏览器也认为可能需要较旧版本的引擎才能正确渲染。 这些试探法并不总是能正常工作,开发人员可以使用
X-UA-Compatible
标头或元标记来覆盖它们。 实际上,这已成为许多框架(如Bootstrap)的标准部分。 现在,该标题实际上是无用的:了解该标题的浏览器的比例很小。 而且,如果您积极支持该站点,那么它不太可能使用会启动兼容模式的技术。
调试数据(X-ASPNet版本,X缓存)
在某些方面,令人惊讶的是,在任何标准中都根本没有提到某些最受欢迎的标题。 本质上,这意味着成千上万的网站以某种方式同意以某种方式使用某种标题。
X-Cache: HIT
X-Request-ID: 45a336c7-1bd5-4a06-9647-c5aab6d5facf
X-ASPNet-Version: 3.2.32
X-AMZN-RequestID: 0d6e39e2-4ecb-11e8-9c2d-fa7ae01bbebc
实际上,这些“未知”标题不是开发人员发明的。 通常,这些是使用特定供应商的某些服务器框架,软件或服务的构件(例如,最后一个标头是AWS的典型代表)。
X-Cache
标头与其他特定标头(例如
X-Cache-Hits
和
X-Served-By
)一起快速添加(和其他CDN)。 启用调试后,会添加更多内容,例如
Fastly-Debug-Path
和
Fastly-Debug-TTL
。
这些标题不能被任何浏览器识别,并且删除它们根本不会影响页面的显示。 但是,由于它们可以为开发人员提供有用的信息,因此您可以保存它们。
误会(语用)
我没想到在2018年我会提到
Pragma
标头,但是根据HTTP Archive的数据,它仍然排在首位(第11位)。 它不仅在1997年被宣布作废,而且从未被认为是响应头,而只是作为请求的一部分。
Pragma: no-cache
但是,它被广泛用作响应头,以至于某些浏览器甚至在这种情况下也可以识别它。 但是,今天,在答案的背景下有人了解
Pragma
却不了解
Cache-Control
可能性几乎为零。 如果要禁用缓存,则只需要
Cache-Control: no-store, private
。
非浏览器(X机器人代码)
前30名中的一个标题不是浏览器的标题。
X-Robots-Tag
为爬虫(例如Google bot或Bing)设计的。 由于它对浏览器没有用,因此您只能为来自搜寻器的请求设置这样的答案。 或者您认为这使测试变得困难或违反了搜索引擎的使用条款。
虫子
最后,值得一提的是对简单错误的光荣提及。
Host
标头在
请求中很有意义,但是如果它出现在响应中,则可能是您的服务器配置不正确(我想知道如何)。 但是,HTTP存档中的68个域在其响应中返回一个
Host
标头。
删除边缘CDN服务器上的标头
幸运的是,如果您的网站与我们一起快速运行,那么使用
VCL删除标头非常简单。 如果您想让开发团队对调试确实很有用,但对公众隐藏了它,那么可以使用Cookie或传入的HTTP标头轻松完成此操作:
unset resp.http.Server;
unset resp.http.X-Powered-By;
unset resp.http.X-Generator;
if (!req.http.Cookie:debug && !req.http.Debug) {
unset resp.http.X-Amzn-RequestID;
unset resp.http.X-Cache;
}
在下一篇文章中,我将讨论真正需要的标题的最佳做法以及如何在CDN边缘服务器上激活它们。