问题引入
前段时间做数据收集时需要下载网宿cdn的日志进行分析。而网宿对日志下载的接口搞得很复杂,又没有提供相应的sdk,只是提供了一个shell脚本,虽然在ubuntu上使用很方便,但是脚本里面的各种重定向分析非常复杂。故此想对重定向在深入了解一点。
查询网宿日志列表的脚本
脚本调用命令和结果(用户名,密码,domain,wskey均已处理,调用结果只有参考作用)
脚本的调用过程是根据参数一步一步的进行302重定向,重定向时会依赖于参数,每次重定向依赖的参数都不相同,不仅仅是url跳转,如果直接使用以下http链接则无法跳转到,因此需要按照shell脚本那样一层一层解析。
HTTP重定向的原理
客户端发起http请求,如果服务端返回http重定向响应,那么客户端会请求返回的新url,这就是重定向的过程,这个过程就是重定向。在客户端和服务端之间自动完成,用户不可见。
不同类型的重定向映射可以划分为三个类别:永久重定向、临时重定向和特殊重定向。
如果你想把自己的网站永久更改为一个新的域名,则应该使用301永久重定向,搜索引擎机器人会在遇到该状态码时触发更新操作,在其索引库中修改与该资源相关的 URL 。
HTTP重定向的使用
主要以Python和shell两种语言来介绍http重定向的使用。
Python
Python常用的http库urllib,urllib2,requests都支持http重定向。以requests库为例做介绍。
如果确定重定向的过程中全部都是http(s)请求,则allow_redirects参数设置成True即可得到最终的http链接。如果不是则需要自己进行递归解析。
如果是要简单的下载文件,则可以使用urllib.urlretrieve
轻松胜任,即使最终链接是ftp。
Shell
使用curl命令模拟
-L参数,当页面有跳转的时候,输出跳转到的页面
-I参数 header信息 当有跳转时,可以通过 curl -L -I URL|grep Location 来确定跳转到的新url地址
最后跳转到需要的ftp链接。
HTTP重定向抓包验证
使用wireshark抓包结果如下:
第一次跳转过程如下图
第二次跳转过程如下图
所以通过抓包可以清晰的看到302跳转的过程
参考:
- csdn-curl命令的常见参数使用
- mozilla-HTTP 的重定向