V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
V2EX 提问指南
toaruScar
V2EX  ›  问与答

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

  •  
  •   toaruScar · 2021-07-19 03:24:08 +08:00 · 1787 次点击
    这是一个创建于 1251 天前的主题,其中的信息可能已经有所发展或是发生改变。

    我常用的一个网站,这里姑且叫它 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 重定向的?

    第 1 条附言  ·  2021-07-19 23:22:47 +08:00

    最后还是解决了,靠的是自建一个服务器,然后上面host一个python的CGI。用油猴自带的无视same-origin policy的请求(GM.xmlHTTPRequest)把网址发给服务器解析。

    7 条回复    2021-07-19 21:23:03 +08:00
    binux
        1
    binux  
       2021-07-19 04:09:39 +08:00 via Android
    Redirect: manual
    不过话说回来,既然中间有一个网址你访问不了,即使你手动 follow 302,依然有一步你不知道它 302 到哪了,又有什么用呢?
    toaruScar
        2
    toaruScar  
    OP
       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
        3
    Telegram  
       2021-07-19 09:15:15 +08:00
    @binux #1 只要拦截短链接第一次跳转的地址,把后面 u 的地址拿出来就行了啊。不继续跳,就不会撞墙
    Telegram
        4
    Telegram  
       2021-07-19 09:24:03 +08:00
    你试试用 WinHttp.WinHttpReques 这个发请求, .Option(6) = False,然后就不会跳转。
    返回的 Response Headers 里就能看到 Location
    toaruScar
        5
    toaruScar  
    OP
       2021-07-19 11:09:04 +08:00
    @Telegram 这个 WinHttp.WinHttpReques 好像不是 js 的吧?
    ysc3839
        6
    ysc3839  
       2021-07-19 13:08:51 +08:00 via Android
    建议使用 Header Editor https://he.firefoxcn.net/
    匹配 http://linktrack.com/?u=,然后跳转到参数 u 的地址。
    SoloCompany
        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 服务器来实现
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   1084 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 20ms · UTC 19:00 · PVG 03:00 · LAX 11:00 · JFK 14:00
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.