求分析一个神奇的 HTTP 跳转
发布于 8 年前 作者 hanzichi 6799 次预览 最后一次回复是 8 年前 来自 问答
最近在研究大麦的购票流程,中间有个 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 抓包,结果如下:
截图框内部分正是最后重定向到的链接。
但是我用 Node 来模拟请求,想得到请求的页面,始终拿不到,我也尝试获取 302 跳转前的页面:
superagent
.get(url)
.set('Cookie', cookie)
.redirects(0)
.on('error', err => {
console.log(err.response.text)
})
.end(function (err, sres) { // callback
})
我省略了一些请求头,实际上我都带上了,结果如下:
而且我也获取不到最后重定向页面的代码,一直获取的是商品详情页,也就是这个页面 https://piao.damai.cn/141343.html 的代码。
我有两个问题:
- 我怎么根据 <www.damai.cn/GotoShopping.aspx?_action=Immediately&proId=12123708&optype=1&companyId=1580&num=1&n=0> 获取最后跳转到的页面的 URL(假设有 cookie 等所有请求头信息)
- 怎么根据 <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 回复
并不会。
你把浏览器的 js 禁用了再看一遍吧,先搞清楚,哪些是服务端做的事,哪些是前端搞了些东西。
@yszou 感谢回复🙏
确实是我表达不清,我知道这里有个 30x 的重定向,可能用「跳转」不太合适
事实是这样的,chrome 上我看到了一个 302 的跳转,直接跳到了目标位置,但是用 Node 模拟的时候,我发现可能不止一个 30x,可能是一个 301 接着一个 302,对这个过程我没法做判断,所以来请教,可能是我描述不清,抱歉。
我的问题是如何判断这个 HTTP 请求具体的过程,跪求指导。。。
不考虑时间因素,如果你用 node 提交的数据,跟 chorme 完全一样,那么结果一定是“直接跳到目标位置”。
如果只是服务端响应的问题,那么你只需要考虑“当前用户状态”就可以了,传递这个状态的标识,一般是 cookie 。
没有什么“可能不止一个”,逻辑一定是确定的,比如如果你没有登录,那么一定是某个流程。
(但是事实情况中,有些场景会比这个复杂,可能会掺杂前端的一些逻辑)
@yszou 我用 curl 请求,得到的结果和帖子中的截图一一样,而用 node 模拟请求,将 curl 中的所有请求头都带上,得到的结果确实截图二,我不太清楚哪一步骤除了问题 …
@hanzichi
不可能。 你先本机把 node 发出的请求的原始 HTTP 报文,拿出来看看吧。跟你说的用 curl 的对比一下。
(你给的网址需要登录,而登录要手机,我没法自己试一下)
第一个
301是 http 转 https 请求,第二个302是通过请求带的参数跳转到指定的商品页面,一般构造http请求的第三方库都可以自动帮你处理这种 30x 跳转问题,而你最终获取的的是跳转后的结果,如request库默认是这么做的,你也可以自己处理这种重定向。@avwo 谢谢回复,现在的结果就是实际得到的结果和模拟得到的结果不一样,而我确实复制了所有的请求头,我怀疑 301 和 302 过程中是否可能更新 cookie?导致得到的结果不一样?