不必要的HTTP标头

HTTP标头对于控制缓存和浏览器如何处理您的内容很重要。 但是其中许多使用不正确或毫无意义,在页面加载的关键时刻花费了额外的资源,并且它们可能无法按照您的想法工作。 在一系列有关最佳做法的文章中,我们将首先介绍不必要的标题。

大多数开发人员都知道重要且有用的HTTP标头。 最著名的是Content-TypeContent-Length ,它们几乎是通用标头。 但是最近,诸如Content-Security-PolicyStrict-Transport-Security类的标头已用于提高Strict-Transport-Security ,而Link rel=preload可提高性能。 尽管浏览器广泛支持,但只有少数浏览器使用它们。

同时,有许多非常受欢迎的头条通常不是新手,也不是很有用。 我们可以借助HTTP归档来证明这一点, HTTP归档是由Google运行并由Fastly赞助的项目,该项目每月使用WebPageTest下载500,000个站点并将结果上传到BigQuery

根据HTTP存档,这是30个最流行的响应标头(基于每个标头显示的存档中的域数),并大致估算了它们的有用性:

标题咨询处现况
日期48779277535621需要协议
内容类型47185627533636浏览器通常需要
伺服器43057807519663选配
内容长度42388435519118有用的
最后修改34424562480294有用的
缓存控制36490878412943有用的
标签23620444412370有用的
内容编码16194121409159压缩内容必需
过期29869228360311选配
由x供电4883204211409选配
语用7641647188784选配
X帧选项3670032105846选配
访问控制允许来源11335681103596有用的
x内容类型选项1107156094590有用的
连结121232987475有用的
年龄740141559242有用的
X缓存527534356889选配
x-xss保护977390651810有用的
严格运输安全425912151283有用的
通过402011747102选配
3828284044308选配
期望值268528040465有用的
内容语言33408137927有争议的
x-aspnet版本67612833473选配
访问控制允许凭证280438230346有用的
X机器人标签17917724911对浏览器无关紧要
x-ua兼容48905624811选配
访问控制允许方法162612920791有用的
访问控制允许标题120573519120有用的

让我们看一下可选的标头,为什么不需要它们以及如何处理。

虚荣(服务器,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多年来一直优于ExpiresExpires简直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-HitsX-Served-By )一起快速添加(和其他CDN)。 启用调试后,会添加更多内容,例如Fastly-Debug-PathFastly-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边缘服务器上激活它们。

Source: https://habr.com/ru/post/zh-CN412813/


All Articles