CNode

求分析一个神奇的 HTTP 跳转

问答
Hhanzichi发布于8 年前最后回复8 年前7 回复7095 浏览0 收藏

最近在研究大麦的购票流程,中间有个 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)

Y
yszou#1·8 年前

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

并不会。

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

H
hanzichi#2·8 年前
引用 yszou在浏览器输入后页面会跳转到 https://trade.damai.cn/multi/confirm? 这样一个页面。 并不会。 你把浏览器的 js 禁用了再看一遍吧,先搞清楚,哪些是服务端做...

@yszou 感谢回复🙏

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

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

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

Y
yszou#3·8 年前

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

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

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

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

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

H
hanzichi#4·8 年前
引用 yszou事实是这样的,chrome 上我看到了一个 302 的跳转,直接跳到了目标位置,但是用 Node 模拟的时候,我发现可能不止一个 30x,可能是一个 301 接着一个 302 不考虑时间因素,...

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

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

@hanzichi

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

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

A
avwo#6·8 年前

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

H
hanzichi#7·8 年前
引用 avwo第一个 301 是 http 转 https 请求,第二个 302 是通过请求带的参数跳转到指定的商品页面,一般构造http请求的第三方库都可以自动帮你处理这种 30x 跳转问题,而你最终获取...

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

参与回复
登录后即可参与回复。登录