客户端发送一个http请求,但是Server端却收到多次原因

虾推啥(虾推啥是一个一行代码推送到微信的免费推送通道)曾经遇到一个问题,用户只发送了一次请求,但是过几个小时或者几分钟后,又会重复收到消息,我也百思不得其解. 开始使用Caddy Server查看Log. 最后解决问题方案居然很简单.最终发现了一摸一样的消息传到了服务器中,但是在http的Header内容有三个地方不同.
Cache-Control
Upgrade-Insecure-Requests
application/signed-exchange
因为第一次用户发送的Http Header里压根就没有上面的东西. 那么这三个东西是什么呢. 看下面解释. 这里我先简单解释一下,其实就是用户使用了http这样一种不安全的访问,所以电信机房的服务器呢,也是很奇怪的,偶尔会对这样的http请求做一次签名授权,好让服务器信任这个http请求. 但是搞笑的是,用户的不安全的http请求已经到达了我的服务器, 电信的中转路由器机房依然在有些时候会对这样的http做一个签名授权,但是这个签名授权居然不是同时发生,而是可能等了1个小时以后再做签名授权,然后把授权后的请求又一次传送到我的服务器. 这样原本只有一个不安全的http请求,变成了两个http请求,而且达到时间还不一样,而且时间可能相差几个小时. 这样,我们虾推啥的用户就会莫名其妙的收到多次消息了.我不知道为什么电信中转路由要这样做. 解决方案很简单,就是凡是签名授权的请求,服务器一概拒绝.




"Upgrade-Insecure-Requests"是一个HTTP请求头,用于向服务器发送信号,表示客户端优先选择加密和带有身份验证的响应,并且可以成功处理upgrade-insecure-requests CSP指令。这个请求头的主要目的是让浏览器自动将不安全的HTTP请求升级为安全的HTTPS请求
当一个网站从HTTP迁移到HTTPS时,可能会遇到一些问题,比如网站中的一些资源(如图片、样式表、JavaScript文件等)仍然使用HTTP URL。在这种情况下,浏览器可能会阻止这些不安全的请求,导致资源无法加载.为了解决这个问题,可以在服务器的响应头中添加"Content-Security-Policy: upgrade-insecure-requests",这样,当浏览器发现存在这个响应头时,会在加载HTTP资源时自动替换成HTTPS请求需要注意的是,这个机制只会升级同源的请求,对于跨源的请求则不会处理。此外,并非所有的浏览器都支持这个请求头,例如,截至某些资料的发布日期,只有Chrome 43.0及以上版本支持这个设置

Signed exchanges(签名交换)是一种机制,允许服务器使用签名对HTTP交换(请求URL、内容协商信息和响应)进行签名,这些签名可以证明交换的真实性。这些签名可以根据源的证书进行验证,以提供对交换有效性的保证。当使用application/signed-exchange MIME类型获取资源时,用户代理会解析它,检查其签名,并在一切正常的情况下处理它。这项技术使得资源的来源的认证独立于其传递方式,可以用于改进网络内容传递的各个方面,例如保护隐私的跨源加载和离线互联网体验在实际应用中,签名交换允许网站以一种可以安全地重新分发和验证其原始来源的方式对网络内容进行签名。这解耦了内容的来源和分发者,使内容传递更快,便于用户之间分享内容,并实现更简单的离线体验
所以,知道呢原理,解决方案也就有了. 检查http header,如果出现上面几种header,直接拒绝就可以呢. 解决方案如下
