http 标头的威力以及你之前不知道的 4 个示例
这篇文章最初发布于此处
Hello Http(标头)
网络上的几乎所有内容都是通过http发送的,甚至非开发人员在使用互联网作为 URL 或链接中的关键字时也见过它
。
Http 代表超文本传输协议,它使我们能够在浏览器和服务器之间传输超文本。
这是一项伟大的技术,几乎自 Web 发明以来就已存在,并且不断发展,提供越来越多的强大功能。
什么是Http 标头?
作为开发者,你可能听说过 http 标头,至少在听说 CORS 策略的时候听说过。
在开发网站时,你肯定听说过这个问题。
但是,http 标头究竟是什么?还有什么其他用途呢?
让我们首先了解它们的作用以及如何使用它们。
当浏览器请求资源(例如本博客的页面)时,它会向服务器发出请求。
该请求如下所示:
fetch("https://www.lorenzweiss.de/race_conditions_explained/", {
credentials: "include",
headers: {
accept:
"text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3",
"accept-language": "en,en-US;q=0.9,de-DE;q=0.8,de;q=0.7",
"cache-control": "max-age=0",
"sec-fetch-mode": "navigate",
"sec-fetch-site": "same-origin",
"sec-fetch-user": "?1",
"upgrade-insecure-requests": "1",
},
referrerPolicy: "no-referrer-when-downgrade",
body: null,
method: "GET",
mode: "cors",
});
因此,您可以看到资源的 URL 或位置、一些有关请求的信息以及许多包含请求信息的标头。
浏览器通过这些标头向服务器提供更多关于请求的信息。例如,它接受哪种数据类型,或者
客户端如何处理缓存。
发送请求后,服务器会回复,并且还会在回复中设置一些标头,如下所示:
:authority: www.lorenzweiss.de
:method: GET
:path: /race_conditions_explained/
:scheme: https
accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3
accept-encoding: gzip, deflate, br
accept-language: en,en-US;q=0.9,de-DE;q=0.8,de;q=0.7
cache-control: max-age=0
cookie: _ga=GA1.2.1173972759.1584812492; _gid=GA1.2.2076192721.1594044231
sec-fetch-mode: navigate
sec-fetch-site: same-origin
sec-fetch-user: ?1
upgrade-insecure-requests: 1
user-agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/78.0.3904.70 Safari/537.36
还有一些信息是服务器想要告诉浏览器如何处理资源的,例如,
如果有 cookie,则必须确定使用了哪种编码等
基本上,在 http 上下文中,浏览器和服务器通信的标头用于扩展简单的
资源请求。您可以将其视为您从在线商店订购的包裹顶部附加的一张纸,它
为您提供有关上下文和所订购资源的更多信息。
大多数标头都有相当不错的默认设置,您无需费心考虑,但有些标头可能
非常重要,例如 CORS 标头。此外,还有许多您可能从未听说过的标头,它们非常有用
,了解如何使用它们对您大有裨益。
你不知道的标题
不用担心,本文不会讨论 CORS 标头。以下 HTTP 标头很少使用,但它们
非常强大,有助于显著改善服务器和浏览器之间的通信。
那么,让我们深入研究一下。以下是一些您可以设置的标题,它们非常有用且实用。
如果范围
什么?为什么?
假设你开始下载一个大型资源,例如视频、图片等,但由于连接问题中途停止。
你If-Range
可以告诉服务器,如果表示形式未发生改变,则发送 Range 中请求的部分。
这意味着只发送缺失的部分,而不是全部内容。
这在处理大量资源且移动设备等网络连接不稳定时非常有用。
因为即使连接中断,资源也可以分部分下载。
如何使用
它既可以与资源最后修改的日期一起使用,也可以与ETag一起使用,后者是帮助判断资源是否无效的关键。
If-Range: <day-name>, <day> <month> <year> <hour>:<minute>:<second> GMT
If-Range: <etag>
例子
If-Range: Wed, 21 Oct 2015 07:28:00 GMT
各不相同
Vary
起源于 Web 或 HTTP 被用于各种用途(而不仅仅是网页)的时代。
它基于使用 HTTP 以多种不同格式交换信息的理念。
它是如何做到这一点的呢?嗯,它告诉服务器在哪个标头中查找信息,以及如何呈现信息。
如今,如果您为不同的客户(例如
移动设备、平板电脑或台式机)提供不同的资源,这将非常有帮助
。想象一下,同一资源的三张不同大小的图片存储在服务器上,具体取决于设备。
那么您只需使用Vary
标头即可告诉服务器检查设备,然后确定要发送的图片大小。
例子
对于与设备相关的图像的示例,您可以简单地传递“用户代理”来告诉服务器
它应该检查用户代理以获取设备信息。
Vary: User-Agent
如何使用
Vary: <header>
只需输入标头,服务器必须检查后才能决定发送哪个资源。
内容处置
如果我们回到向服务器发出请求的例子,例如加载某个网站,浏览器显然
必须显示响应的资源。
但也可能出现服务器发送资源,浏览器应该自动下载到用户电脑的情况,
例如图片或 PDF 等。
服务器可以通过标头告诉浏览器应该如何处理附加的资源Content Disposition
。
例子
通过定义,Content-disposition
浏览attachment
器就知道这是一个需要下载的资源,而不仅仅是
显示。
Content-Disposition: attachment; filename="data.pdf"
如何使用
您可以将标题定义为inline
或attachment
,其中 `inline 始终是默认值。
Content-Disposition: <inline | attachment>
功能策略
这是一个相当新的标头,因此只有现代浏览器支持(抱歉,所有 IE 用户)。不过,
我还是想提一下,因为我认为它在某些用例中确实很有帮助。
基本上,就是要使用的 iframe。feature-policy tells the browser which features or apis the browser should provide to the document and its
例如,它可以禁止该网站内的所有脚本或 iframe 等,以允许摄像头或麦克风等敏感 API。
如何使用
Feature-Policy: <directive> <allowlist>
这directive
是该功能的名称。您可以在此处查看完整的功能列表。
它allowlist
定义了允许使用该指令的来源。
例子
假设我们希望网站不使用麦克风或摄像头。使用此标头,
文档或包含的 iframe 将无法访问这些功能。
Feature-Policy: microphone 'none'; camera 'none'
更多标题:
这里还有一些值得一提的标题:
结论
HTTPS 标头很棒,也很有用!但有时它们可能非常复杂,很难一目了然地了解哪些标头可用以及它们带来的好处。
此外,在开发网站时,尤其是在前端开发中,你不会经常接触它们,除非使用 CORS 标头。
但我认为这忽略了一些可能性。HTTP 标头更好地代表了服务器和
客户端之间的通信,我们都知道,沟通是良好关系的关键。
我希望我能帮你揭开 HTTP 标头的神秘面纱。如果我遗漏了什么有用的标头,
请随时给我发邮件或以任何方式联系我。