我常用的一个网站,这里姑且叫它 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 重定向的?
最后还是解决了,靠的是自建一个服务器,然后上面host一个python的CGI。用油猴自带的无视same-origin policy的请求(GM.xmlHTTPRequest)把网址发给服务器解析。
1
binux 2021-07-19 04:09:39 +08:00 via Android
Redirect: manual
不过话说回来,既然中间有一个网址你访问不了,即使你手动 follow 302,依然有一步你不知道它 302 到哪了,又有什么用呢? |
2
toaruScar OP @binux 你提到了”既然中间有一个网址你访问不了[...]”,这里我补充说明一下。
第一次请求之后,返回来的跳转链接里面,就带有了最终的 URL 。比如说,第一次跳转的地址就是“ http://linktrack.com/?u=http://example.com/external-link ”,如果能把链接里面 u 的参数提取出来,这样就大功告成了。 我试了试,Redirect: manual 是不行的,遇到 302 照样跳。https://github.com/whatwg/fetch/issues/763 |
4
Telegram 2021-07-19 09:24:03 +08:00
你试试用 WinHttp.WinHttpReques 这个发请求, .Option(6) = False,然后就不会跳转。
返回的 Response Headers 里就能看到 Location |
6
ysc3839 2021-07-19 13:08:51 +08:00 via Android
|
7
SoloCompany 2021-07-19 21:23:03 +08:00 1
纯 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 服务器来实现 |