如何用 Javascript 截取 302 跳转的地址?

2021-07-19 03:24:08 +08:00
 toaruScar

我常用的一个网站,这里姑且叫它 sd.com ,给所有的外链都加装了追踪器,过长的链接也会被截断。

(以下的网址均为化名)

比如有人发帖,里面包含了一个网址: http://example.com/external-link 。那帖子发出来,链接就会变成

<a href="http://sd.com/?url=vijsdneksodk">http://example.com/exter...</a>

href 里的”vijsdneksodk“好像不是从 http://example.com/external-link 这里计算出来的。

http://sd.com/?url=vijsdneksodk 请求一下就会得到一个 302 跳转,Location 是 http://linktrack.com/?u=http://example.com/external-link (当然 u 的参数是 url 编码过的,这里为了易读性就解掉了)

这个链接再请求一下,又会得到一个 302 跳转,Loacation 是 http://yet.another.linktrack.com/?u=http://example.com/external-link

这样子连环跳转大概会有 3-4 次,每跳一次都给我塞一堆 cookie,这个还好,最讨厌的是这一连串的跳转中,有一个追踪网站的域名我这里访问不了,所以每次点击链接都会出错。

我试着写个油猴脚本,把 href 里的 http://sd.com/?url=vijsdneksodk 还原成 http://example.com/external-link,这就需要向这个链接发一个 HEAD 请求,然后查看里面的 Location 参数。但是发现好像所有的请求( XMLHttpRequest 、fetch 之类的)都会自动跟随 302,然后直接撞上那个被拦截的域名并报错。

所以我想问问有没有什么油猴脚本的写法,能对一个网址发起 HEAD 请求,然后不跟随 302 重定向的?

1529 次点击
所在节点    问与答
7 条回复
binux
2021-07-19 04:09:39 +08:00
Redirect: manual
不过话说回来,既然中间有一个网址你访问不了,即使你手动 follow 302,依然有一步你不知道它 302 到哪了,又有什么用呢?
toaruScar
2021-07-19 04:35:50 +08:00
@binux 你提到了”既然中间有一个网址你访问不了[...]”,这里我补充说明一下。
第一次请求之后,返回来的跳转链接里面,就带有了最终的 URL 。比如说,第一次跳转的地址就是“ http://linktrack.com/?u=http://example.com/external-link ”,如果能把链接里面 u 的参数提取出来,这样就大功告成了。 我试了试,Redirect: manual 是不行的,遇到 302 照样跳。https://github.com/whatwg/fetch/issues/763
Telegram
2021-07-19 09:15:15 +08:00
@binux #1 只要拦截短链接第一次跳转的地址,把后面 u 的地址拿出来就行了啊。不继续跳,就不会撞墙
Telegram
2021-07-19 09:24:03 +08:00
你试试用 WinHttp.WinHttpReques 这个发请求, .Option(6) = False,然后就不会跳转。
返回的 Response Headers 里就能看到 Location
toaruScar
2021-07-19 11:09:04 +08:00
@Telegram 这个 WinHttp.WinHttpReques 好像不是 js 的吧?
ysc3839
2021-07-19 13:08:51 +08:00
建议使用 Header Editor https://he.firefoxcn.net/
匹配 http://linktrack.com/?u=,然后跳转到参数 u 的地址。
SoloCompany
2021-07-19 21:23:03 +08:00
纯 js 肯定是不行的, 这违反了 web 安全规则 (类似于 http only 的 cookie 为什么不能改通过读取 response header 获取到)
具体讨论可参考 https://stackoverflow.com/questions/8238727/how-to-prevent-ajax-requests-to-follow-redirects-using-jquery

要实现这样的需求, 只有两种办法
1. 浏览器提供扩展的 api (没具体了解过, 或许 chrome 能支持, 但大概率没有)
2. 自己搭建一个 CORS web 服务器来实现

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/790281

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX