`
qingwengang1
  • 浏览: 8938 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

Chrome在302重定向的时候对原请求产生2次请求的问题说明

阅读更多

猿教程_-webapi教程-WebAPI教程

猿教程_-webapi教程-Web API概述

猿教程_-webapi教程-新建Web Api项目

猿教程_-webapi教程-测试Web API

猿教程_-webapi教程-Web API Controller

猿教程_-webapi教程-配置Web API

猿教程_-webapi教程-Web API路由

猿教程_-webapi教程-参数绑定

猿教程_-webapi教程-Action方法返回类型

猿教程_-webapi教程-Web API Request/Response 数据格式

猿教程_-webapi教程-媒体格式器

猿教程_-webapi教程-Web API过滤器

猿教程_-webapi教程-创建包含CRUD操作的Web API接口-第一部分

猿教程_-webapi教程-创建包含CRUD操作的Web API接口2:实现Get方法

猿教程_-webapi教程-创建包含CRUD操作的Web API接口3:实现Post方法

猿教程_-webapi教程-创建包含CRUD操作的Web API接口4:实现Put方法

猿教程_-webapi教程-创建包含CRUD操作的Web API接口5:实现Delete方法

这个问题应该确确实实是一个Chrome的BUG,我在自己的编程环境中发现,并在多个服务器,多个编程语言的运行环境,以及多个浏览器下都测试过,都看到有2次请求出现。为了证明不是自己环境的问题,我也特意去找了一些其他站点,用它里面的一些会产生重定向的请求来测试。比如这个请求地址http://wenda.golaravel.com/account/openid/qq_login/,这是golaravel问答模块进行qq登录的链接地址,它会重定向到qq授权登录的页面。

使用fiddler监控wenda.golaravel.com这个站点,然后在Chrome里面访问以上地址,回到fiddler查看监控结果:

image

从这个结果可以明确地看到,Chrome对这个地址发出了2次http请求,并且这两次http请求都从服务器拿到了Response。从fiddler的Statistics栏里面,可以对比看出这两个请求过程的一些信息: 
第一个是:

image 
第二个是: 
image 
从这个对比结果可以看到,这两个请求并不是一种串行的关系,而是并行的关系。但是这个问题的特性还不止这么简单,目前我发现的一些现象如下:

1)不是每次都会出现这个情况,我只能说大部分测试操作都出现这种情况,但是少部分情况是正常的:访问302的地址,对原地址只发起了一次请求,第二次是对302 Location指定的地址的请求,这是正常的; 
2)这两个请求并不是每次都能成功从服务器拿到响应,有的时候其中的一个会报500的错误,或者是显示failed,此时如果观察fiddler的log记录,会看到有下面的一些关键信息:

3)大部分情况下,都是这两个请求先发起,然后再对302 Location重定向请求;但是极少的情况会遇到302重定向请求夹在这两个请求中间。

目前我并没有找到这个问题产生的原因,网上相关的资料太少了,所以我只能从多个方面来验证是否是Chrome本身的问题,最后得出的结论也跟我的猜想一致,这就是Chrome较新版本的一个BUG,我在当前时间点的最新版本的Chrome浏览器里面看到这个现象的:

image

下面我会详细地证明它是否为Chrome的一个BUG。

1. 问题的发现

我使用laravel框架写了一个很简单的程序,就几个页面,做微信登录的demo用的,所以页面里的微信登录按钮,实际上就是一个需要重定向到微信授权页面的地址。我在浏览器里面访问这个地址的时候,在本地windows下的apache服务器的access.log里面,发现这一个访问操作产生了三次http请求: 
image 
从这个日志里很明显地看到有2次对/login/weixin的请求,这个就是重定向请求的原请求记录。发现这个问题之后,我并不认为是服务器或者浏览器的问题,而是首先怀疑是否是自己代码里面有重定向loop的情况。所以第一步就去仔细地检查自己的代码:

最后的redirect方法是:

这个代码里的RedirectResponse是laravel框架提供的类。从这个代码,我并没有看出什么问题,因为没有多次创建Response的处理。所以开始怀疑是否是新版的laravel框架的问题,因为我用的是最新的laravel框架。所以我又用公司的php环境测试了一下,公司的php环境用的yii这个php框架,结果发现,公司的环境在本地依然存在这个问题。

为了排除是框架的问题,我又自己写了两个最简单的php页面: 
image 
image 
我把demo1部署到demo1.com,demo2部署到demo2.com,然后访问demo1.com来测试。最后也还是遇到了这个问题。在这一次测试里面,我还发现了有两个关键点:

1)如果把302改成301重定向,那么chrome就不会产生两次请求。但是实际上301用在这里是不对的,因为它的含义是原地址的资源已经永久转移到别的位置了。 
2)这个问题导致的两次对原地址的请求,大部分情况下,服务器都能收到并进行处理。(demo1里面的打印信息,在这个问题出现的时候,每次都打印两个时间信息,说明服务器响应了2次)。这意味着用户的一次访问操作,浏览器发出了2个请求,服务器对同一个用户操作进行了2次处理。这并不是个没有影响的事,比如当这个请求对某个资源的状态做了一些持续性的改变时,如数据累计,那就意味着用户一次操作,就会累计2次,这样这些数据结果可能就有问题了。这也是我把这个问题详细记录说明的主要原因,我觉得开发中应该注意到这个问题的存在,以便在排除一些疑难的数据问题的时候,可以思考到这个层面上来。

到此为止,基本上已经排除是php框架的问题了。接下来考虑的问题产生对象主要是编程语言,服务器以及浏览器。

2. 排查是否为编程语言的问题

为了验证是否为php语言本身的问题,我又用express框架写了以下简单代码,并运行在node的环境里面来测试:

 

 

最后测试发现这个问题,在Nodejs里面同样存在。所以也可以排除是php语言的问题了。

3. 排查是否为服务器的问题

因为这个问题本身是在本地windows服务器里面发现的,所以我怀疑是否为本机apache的问题,所以我又把相关的代码部署到远程的nginx服务器上,最后同样测试到这个问题的存在。

加上上一步在nodejs里面测试的时候,实际上是用本机的node服务器运行的,综合这两个服务器测试结果,也能证明并不是apache服务器的问题。

4. 排查是否为浏览器的问题

我的机子上有360浏览器,firefox,IE11,Edge浏览器和最新的Chrome浏览器的。最后测试发现只有Chrome浏览器里面有这个问题,其它浏览器测试,在fiddler里面都只能看到对原地址仅发起了一次http请求,在每个浏览器我都重复做了大概十多次访问操作才得出这个结论。为了进一步验证Chrome的版本问题,我又特意删了当前版本,下载了一个Chrome46的浏览器测试,结果没有发现这个问题。到此为止,也就基本上可以认为是Chrome浏览器的问题。

5. 进一步排查是否为本机运行环境的问题

为了进一步排查是自己开发环境的问题,我专门到网上找了一些其他站点的302请求地址做测试。除了本文开头提供的地址,下面这个地址也可以测试:

http://www.toutiao.com/auth/connect/?type=sso&platform=weixin&next=https://sso.toutiao.com/auth/login_success/?service=http://www.toutiao.com/

image

最后,根据以上的排查内容,可以认定这个问题是Chrome的一个BUG,我已经report给他们了,回不回复不重要,最重要的是下一个版本这个问题是否能够解决。所以接下来这个问题,我的处理方式是:跟进chrome的版本更新情况,并在新版本中进行测试。希望它能在后续的版本中得到解决。

其实在以上排查过程中,还有一些情况值的考虑,比如操作系统环境,网络环境的影响,毕竟http请求本身处于这两个大的因素之下,所以也不能完全排除它们的原因。所以,要是感兴趣的朋友,觉得这个问题值得研究的话,非常希望你能把自己的测试结果反馈过来,如果这个问题在你的机器上也存在,那么就能增加本文的客观性和正确性,就能帮助更多的人;如果很多人都没有测试出这个问题,就说明本文的结论有误,这篇文章应该作废才行。

分享到:
评论

相关推荐

    Google chrome 80版本Google chrome 80版本 重定向问题解决.docx

    在使用Google Chrome 80版本时,用户可能会遇到“重定向次数过多”的问题,这通常是由于浏览器的新特性或更新导致的。在这个特定的文档中,我们找到了一个针对此问题的临时解决方案,涉及到Chrome的一项名为“Same...

    chrome插件修改请求头

    Header Editor是一款管理浏览器请求的Chrome扩展,包括修改请求头、修改响应头、重定向请求、取消请求。  您可以从Redirector导入规则  规则说明:  1、匹配类型  规则会应用到满足相应匹配条件的URL上  全部:...

    重定向chrome浏览器插件ray

    重定向Chrome浏览器插件Ray是一种专门用于定制网络流量路由的工具,主要应用于前端开发和网络调试。这款插件的核心功能是实现HTTP(S)请求的重定向,帮助开发者控制和优化网页加载过程,甚至可以用于代理服务,使得...

    XSwitch一个用于转发请求网址的Chrome扩展程序

    它允许用户自定义规则,将原本请求的目标网址重定向到其他地址,从而实现对网络请求的控制和拦截。 ### 1. Chrome扩展程序基础知识 Chrome扩展程序是由一系列文件组成的,包括HTML、CSS、JavaScript等,它们通过...

    HeaderEditor:管理浏览器的请求,包括修改请求头和响应头,重定向请求,取消请求

    标题编辑器 可以修改请求的扩展,包括请求标头,响应标头,重定向请求和取消请求。 有关更多文档,请访问获取此扩展 。 。 安装我们的。关于权限标头编辑器需要这些权限: 标签:打开链接或切换到标签webRequest,...

    request-x:Chrome扩展程序可阻止或重定向意外请求

    重定向请求 是什么使它与众不同? 有诸如ABP之类的阻止程序,它们通过URL阻止请求。 请求X可以做更多的事情,通过方法和URL阻止请求。 例如,有时我们需要通过GET请求显示数据,但是不想通过POST请求进行修改,...

    redirect-a-tron:在 chrome devtools 中添加重定向 url 选项卡的 chrome 扩展,用于在实时环境中测试本地文件

    重定向-a-tron 是一款专为 Chrome 浏览器设计的开发者扩展,旨在帮助前端开发者在实时环境中便捷地测试本地文件的重定向功能。这款扩展将一个专门的重定向 URL 选项卡添加到了 Chrome 的开发者工具(DevTools)中,...

    URLRedirector URL重定向 | 谷歌(Chrome)浏览器插件

    帮助你重定向特定网页到新地址,以解决 google CDN 无法访问、stackoverflow 无法加载等的问题 【插件开发者】 @ghost 【插件更新】 2019-05-06 09:30:56 【插件版本】 1.3.17 【插件标签】 高效...

    消除浏览器的301重定向缓存

    在本文中,我们将详细讲述如何消除浏览器的301重定向缓存,包括缓存的机理、问题的出现原因、解决方法等。 缓存的机理 浏览器的301重定向缓存是基于HTTP协议的。HTTP协议中,301状态码表示永久重定向,也就是说,...

    xproxy:Chrome扩展程序,用于转发请求网址

    一个通过制定的规则来重定向请求的 Chrome 浏览器插件,灵感来源于,并且利用 React 重构整个项目。解决的痛点在日常开发和调试过程中,由于测试环境的文件变更需要使用 CDN 上的静态文件,修改后需要重新发布,十分...

    netify:Chrome扩展程序,用于拦截和修改网络请求

    调试代理将允许您截取和变异来自网页的请求Netify是调试代理,将允许您截取和变异您的请求,例如Fiddler或Charles,但是它更紧凑并且可以直接在Chrome devtools中实现。 Netify为您提供的功能: 按URL,方法或资源...

    常见请求和响应头-说明.doc

    请求头主要用于指示客户端的偏好和能力,而响应头则包含了服务器对请求的响应信息。以下是一些常见的请求头和响应头及其详细解释: 1. Accept:这个头字段用于指定客户端能够接收的内容类型,例如文本、HTML、JSON...

    c#模拟浏览器请求

    在实际应用中,你可能还需要处理身份验证、cookies、重定向等问题,这可以通过设置`HttpClientHandler`实例并传递给`HttpClient`构造函数来实现。同时,为避免过多的并发请求,可以使用`SemaphoreSlim`来限制同一...

    ghpages-redirect.js:重定向 GitHub Pages 的所有请求以在 Google Chrome 中使用 HTTPS

    标题 "ghpages-redirect.js:重定向 GitHub Pages 的所有请求以在 Google Chrome 中使用 HTTPS" 指涉的是一个 JavaScript 文件,它的主要功能是确保所有访问 GitHub Pages 的请求都被自动重定向到使用 HTTPS(安全超...

    Node.js-r2是request模块的作者推出了新的HTTP请求模块

    Node.js 是一个基于Chrome V8引擎的JavaScript运行环境,它让开发者可以在服务器端使用JavaScript进行编程,极大地推动了Web开发的进程。而request模块曾是Node.js社区中广泛使用的HTTP客户端库,它使得发送HTTP请求...

    Android使用OkHttp进行重定向拦截处理的方法

    在Android开发中,OkHttp是一个常用的网络请求库,它提供了高效、灵活的网络通信功能。在某些场景下,我们可能需要对重定向进行特殊处理,比如在模拟用户登录后获取登录后的网页内容。本文将详细介绍如何使用OkHttp...

    网络爬虫-解决直接访问请求地址返回403错误的问题-Python实例源码.zip

    在进行网络爬虫开发时,我们常常会遇到服务器返回403 Forbidden错误的情况。...在实际编程中,可以参考提供的"网络爬虫-解决直接访问请求地址返回403错误的问题"的源码示例,学习如何在Python中应用上述策略。

    配置Chrome支持本地(file协议)的AJAX请求

    在目标路径后添加"--allow-file-access-from-files"(注意前面有一个空格),然后重新启动Chrome,这样就启用了对本地文件的AJAX支持。 对于Mac用户,需要通过终端命令来开启Chrome的这一功能。在终端中输入"open -...

    07.快手视频下载之Chrome浏览器Network分析及Python爬虫探讨1

    - 在Network面板中,筛选XHR请求,这将显示所有XMLHttpRequest请求,通常是服务器交互和获取JSON数据的地方。 - 刷新页面,观察请求,找到包含视频信息的graphql请求。这通常会返回包含视频ID和主播ID的JSON数据。...

    xswitch:用于重定向请求网址的Chrome扩展程序

    采用以支持在转发规则中写注释 可以使用摩纳哥编辑器(VSCode)中的部分快捷键,比如通过⌘K ⌘F组合键可以实现格式化JSON的功能 自动补全 支持CORS,支持凭证 跨域和缓存分区键(快捷单击浏览器工具栏的XSwitch插件...

Global site tag (gtag.js) - Google Analytics