求分析一个神奇的 HTTP 跳转
发布于 1 个月前 作者 hanzichi 546 次浏览 来自 问答

最近在研究大麦的购票流程,中间有个 URL 的跳转实在百思不得其解。 以这个 URL 为例:<www.damai.cn/GotoShopping.aspx?_action=Immediately&proId=12123708&optype=1&companyId=1580&num=1&n=0> 在浏览器输入后页面会跳转到 https://trade.damai.cn/multi/confirm?*** 这样一个页面。 我直接用 charles 抓包,结果如下: 1.png 截图框内部分正是最后重定向到的链接。 但是我用 Node 来模拟请求,想得到请求的页面,始终拿不到,我也尝试获取 302 跳转前的页面:

superagent
    .get(url)
    .set('Cookie', cookie)
    .redirects(0)
    .on('error', err => {
      console.log(err.response.text)
    })
    .end(function (err, sres) { // callback
    })

我省略了一些请求头,实际上我都带上了,结果如下: 2.png 而且我也获取不到最后重定向页面的代码,一直获取的是商品详情页,也就是这个页面 https://piao.damai.cn/141343.html 的代码。 我有两个问题:

  1. 我怎么根据 <www.damai.cn/GotoShopping.aspx?_action=Immediately&proId=12123708&optype=1&companyId=1580&num=1&n=0> 获取最后跳转到的页面的 URL(假设有 cookie 等所有请求头信息)
  2. 怎么根据 <www.damai.cn/GotoShopping.aspx?_action=Immediately&proId=12123708&optype=1&companyId=1580&num=1&n=0> 获取最后跳转到的页面的 HTML 代码?我将所有头部信息全部填完后模拟请求,一直请求到的是商品详情页也就是这个页面 https://piao.damai.cn/141343.html 的代码,不知道哪个环节出了问题

我用的 HTTP 库是 superagent,望赐教!

7 回复

在浏览器输入后页面会跳转到 https://trade.damai.cn/multi/confirm?*** 这样一个页面。

并不会。

你把浏览器的 js 禁用了再看一遍吧,先搞清楚,哪些是服务端做的事,哪些是前端搞了些东西。

@yszou 感谢回复🙏

确实是我表达不清,我知道这里有个 30x 的重定向,可能用「跳转」不太合适

事实是这样的,chrome 上我看到了一个 302 的跳转,直接跳到了目标位置,但是用 Node 模拟的时候,我发现可能不止一个 30x,可能是一个 301 接着一个 302,对这个过程我没法做判断,所以来请教,可能是我描述不清,抱歉。

我的问题是如何判断这个 HTTP 请求具体的过程,跪求指导。。。

事实是这样的,chrome 上我看到了一个 302 的跳转,直接跳到了目标位置,但是用 Node 模拟的时候,我发现可能不止一个 30x,可能是一个 301 接着一个 302

不考虑时间因素,如果你用 node 提交的数据,跟 chorme 完全一样,那么结果一定是“直接跳到目标位置”。

如果只是服务端响应的问题,那么你只需要考虑“当前用户状态”就可以了,传递这个状态的标识,一般是 cookie 。

没有什么“可能不止一个”,逻辑一定是确定的,比如如果你没有登录,那么一定是某个流程。

(但是事实情况中,有些场景会比这个复杂,可能会掺杂前端的一些逻辑)

@yszou 我用 curl 请求,得到的结果和帖子中的截图一一样,而用 node 模拟请求,将 curl 中的所有请求头都带上,得到的结果确实截图二,我不太清楚哪一步骤除了问题 …

@hanzichi

不可能。 你先本机把 node 发出的请求的原始 HTTP 报文,拿出来看看吧。跟你说的用 curl 的对比一下。

(你给的网址需要登录,而登录要手机,我没法自己试一下)

第一个 301 是 http 转 https 请求,第二个 302 是通过请求带的参数跳转到指定的商品页面,一般构造http请求的第三方库都可以自动帮你处理这种 30x 跳转问题,而你最终获取的的是跳转后的结果,如request库默认是这么做的,你也可以自己处理这种重定向。

@avwo 谢谢回复,现在的结果就是实际得到的结果和模拟得到的结果不一样,而我确实复制了所有的请求头,我怀疑 301 和 302 过程中是否可能更新 cookie?导致得到的结果不一样?

回到顶部