为什么访问同一个网址却返回不同的内容

为什么,访问,同一个,网址,返回,不同,内容 · 浏览次数 : 1347

小编点评

**HTTP 内容协商 (Content Negotiation)** 当我们使用 Google 浏览器访问 `csvbase.com` 时,浏览器会进行 HTTP 内容协商以确定最适合的响应内容格式。 **内容协商过程** 1. 浏览器在请求头中指定了 `Accept` 字段,值为 `*/*`。 2. 服务器根据 `Accept` 字段的优先级,选择最合适的响应内容类型进行响应。 3. 如果服务器无法满足客户端的 `Accept` 字段中的所有要求,则会返回一个 `406 Not Acceptable` 的错误状态码。 **浏览器返回的内容格式** 由于服务器返回的是 `text/csv` 格式的内容,因此当我们使用 curl 或 wget 命令访问请求时,会得到一个 csv 格式的响应。 **结论** 当我们使用 Google 浏览器访问 `csvbase.com` 时,浏览器会通过 HTTP 内容协商机制确定最合适的响应内容格式,并根据该格式返回相应的内容。

正文

哈喽大家好,我是咸鱼。今天给大家分享一个关于 HTTP 有趣的现象

链接:https://csvbase.com/meripaterson/stock-exchanges

我们用浏览器访问这个链接,可以看到下面的网页

但如果我们使用 curl 命令去访问这个链接呢?

可以看到返回的是一个 csv 文件

我们用 wget 命令下载下来看看

可以看到 text/csv 字段,表示下载了一个 csv 格式的文件

奇怪,同样的 url ,为什么浏览器返回的内容跟 curl、wget 命令返回的内容却不一样

内容协商

当 HTTP 客户端去发送响应给 HTTP 服务端的时候,响应里面会包含响应头(headers)

我们来看下 Google浏览器发送的响应头

我们着重注意一下响应头里的 accept 字段

这个 accept 报头是一个无序列表,它告诉了 HTTP 服务端应该返回什么媒体类型(又称内容类型或文件格式)的内容给我

以上面 Google 浏览器的 accept 报头为例:这段 accept 报头表示该请求中浏览器可接受的媒体类型(或文件格式)的偏好。从左到右,各类型的优先级逐渐降低

  • text/html: 浏览器首选的媒体类型,即 HTML 文本。
  • application/xhtml+xml: 次选的媒体类型,即 XHTML 文本。
  • application/xml;q=0.9: 服务器可以发送的 XML 类型的文本,但是客户端更愿意接收前面的两种媒体类型,所以权重为 0.9。
  • image/avif,image/webp,image/apng: 浏览器能够接受的图片类型,优先级逐渐降低。如果服务器返回多种可接受的图片类型,则浏览器将选择优先级最高的那个。
  • */*;q=0.8: 如果服务器无法以以上任何一种类型响应,则浏览器愿意接受任何类型,但是这个类型的优先级最低,只有 0.8。
  • application/signed-exchange;v=b3;q=0.7: 该媒体类型是用于实现 Web 页面“前进”和“后退”功能的标准。客户端更愿意接受前面提到的其他媒体类型,所以该类型的权重为 0.7。

所以说我们用 Google 浏览器去访问这个 url (csvbase.com)时,会跟 HTTP 服务端去协商:你应该返回什么类型的内容给我,优先是 text/html

而 curl 命令或者 wget 命令去访问请求这个 url 时,默认情况下发送的请求头中的 Accept 字段的值是 */*,表示支持接受所有类型的响应

而这个网站 csvbase 默认格式是 csv,所以说当 curl 命令或者 wget 命令去访问请求这个 url 时,得到的是一个 csv 格式返回内容

这就是 HTTP 协议中的内容协商(content negotiation)

HTTP内容协商是指客户端和服务器端协商出最适合的响应数据格式、语言等内容的过

HTTP中的内容协商机制,可以确保客户端和服务器端发送和接收的内容格式是一致的,从而提高通信的效率和可靠性

HTTP内容协商通常有三种类型:

  • 基于请求头的内容协商(Header-based content negotiation)
  • 基于URL的内容协商(URL-based content negotiation)
  • 基于实体的内容协商(Entity-based content negotiation)

基于请求头的内容协商是指客户端在请求头中指定自己可以接受的内容类型(MIME类型),服务器根据客户端的请求头中所指定的信息,选择最合适的响应内容类型进行响应

常用的请求头字段是 Accept 和 Accept-Language。服务器端根据 Accept 字段的内容,选择最匹配的响应类型进行响应

如果客户端所能接受的响应类型都不能满足服务器端的响应类型,则会返回一个 406 Not Acceptable 的错误状态码

那有小伙伴可能会想:我用 curl 命令或者 wget 命令不想得到一个 csv 格式的响应,我想 HTTP 服务端返回其他类型的响应,这时候该怎么办

我们可以手动修改请求头来告诉 HTTP 服务端它可以接受的媒体类型(即文件格式)的偏好

参考文章:

How does it know I want csv? ⁠— An HTTP trick (csvbase.com)

与为什么访问同一个网址却返回不同的内容相似的内容:

为什么访问同一个网址却返回不同的内容

哈喽大家好,我是咸鱼。今天给大家分享一个关于 HTTP 有趣的现象 链接:https://csvbase.com/meripaterson/stock-exchanges 我们用浏览器访问这个链接,可以看到下面的网页 但如果我们使用 curl 命令去访问这个链接呢? 可以看到返回的是一个 csv 文

【Azure 应用服务】Function App / App Service 连接 Blob 报错

问题描述 因 Blob 启用了防火墙功能,但是当把App Service 或 Function App的出站IP地址都加入到Blob的白名单中,为什么访问还是403错误呢? 问题解答 Azure Storage的IP网络规则不适用于同一数据中心的客户端。 存储帐户部署在同一区域中的服务使用专用的 A

(性能测试)--记录一次高可用场景导致CPU资源升高

测试场景:高可用场景--限流测试; 被测交易:查询类交易,HTTP协议; 交易链路:jmeter - web - coimpre(前置服务) -- coimbp -- cobp (coimbp 、coimpre 都会访问同一个数据库); 注:cobp 为合肥机房,其他服务均为北京机房,要注意跨网段存

【Azure Redis】Azure Redis添加了内部虚拟网络后,其他区域的主机通过虚拟网络对等互连访问失败

问题描述 跨区域无法访问Azure Redis服务, Redis 启用了Network并设置在一个VNET中,现在客户端部署在另一个区域数据中心中,两个数据中心区域使用VNET Peer(对等互连)访问。但是为什么不能访问Redis服务呢? 问题解答 根据Azure Redis的官方介绍,因为Red

您可知道如何通过`HTTP2`实现TCP的内网穿透???

可能有人很疑惑应用层 转发传输层?,为什么会有这样的需求啊???哈哈技术无所不用其极,由于一些场景下,对于一个服务器存在某一个内部网站中,但是对于这个服务器它没有访问外网的权限,虽然也可以申请端口访问外部指定的ip+端口,但是对于访问服务内部的TCP的时候我们就会发现忘记申请了!这个时候我们又要提交

《consul 简易上手指南》

consul 是一个用来做服务发现的框架,具有分布式、高可用以及可横向扩展的特性 什么是服务发现?为什么要实现服务发现? 举个常见的例子: 假设有一台 client 想要实现不同的业务,就需要调用接口去访问后端的server 那这样 client 就需要知道后端 server 的网络配置,通常是将

LRU算法

1、什么事LRU 单从代码层面来说,我认为lru算法很容易实现,重点是我们要知道什么是lru算法。 LRU 英文全称是 Least Recently Used,英译过来就是”最近最少使用“的意思,假如我们有一块内存,专门用来缓存我们最近发访问的网页,访问一个新网页,我们就会往内存中添加一个网页地址,

[转帖]api网关介绍

https://www.cnblogs.com/jackssybin/p/16282788.html 1.什么是网关 API网关是一个系统的唯一入口。是众多分布式服务唯一的一个出口。它做到了物理隔离,内网服务只有通过网关才能暴露到外网被别人访问。简而言之:网关就是你家的大门 2.提供了哪些功能 身份

数据库连接池长时间不用,乍一用还用不了,结果是防火墙的锅

前言 我们的程序,在实际的网络部署时,一般比较复杂,会经过很多的网络设备,防火墙就是其中的一种。做开发的同事,一般对这块了解不多,也很可能被防火墙坑到。比如,应用一般需要访问数据库,为了避免频繁建立连接,一般是会提前建立一个连接池,每次来一个请求,就从连接池取一个连接来用,用完再归还到池子里。 连接

聊聊FASTER和进程内混合缓存

最近有一个朋友问我这样一个问题: 我的业务依赖一些数据,因为数据库访问慢,我把它放在Redis里面,不过还是太慢了,有什么其它的方案吗? 其实这个问题比较简单的是吧?Redis其实属于网络存储,我对照下面的这个表格,可以很容易的得出结论,既然网络存储的速度慢,那我们就可以使用内存RAM存储,把放Re