V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
• 请不要在回答技术问题时复制粘贴 AI 生成的内容
Wxh16144
V2EX  ›  程序员

一个奇淫技巧实现的短网址

  Wxh16144 ·
Wxh16144 · 2025 年 1 月 17 日 · 12967 次点击
这是一个创建于 359 天前的主题,其中的信息可能已经有所发展或是发生改变。

写在前面哈

这个方案只是出于学习和分享的目的,肯定是不建议在生产环境中使用的。并且不是最优的方案,只是一个简单的实现。

实现

  1. 使用 GitHub Pages 自定义子域名,然后通过 404 页面实现跳转。
  2. 本地使用 git commit --allow-empty -m 将每一个真实网址作为一个 commit message 提交到 GitHub 仓库。
  3. 由于每一个提交都会生成一个唯一的 SHA-1 值,然后通过这个 SHA-1 值作为短网址的路径。
  4. 最后在 404 页面中通过 GitHub commits api 用 SHA-1 值获取到 commit message ,然后跳转到真实网址。

比如: https://link.wxhboy.cn/22bb (22bb 是一个 SHA-1 值)

以上就是整个实现的思路。源码在这里, Wxh16144/links/blob/gh-pages/404.html

Firebase Dynamic Links 迁移

Firebase Dynamic Links 已被弃用,不应该在新项目中使用。该服务将于 2025 年 8 月 25 日关停。

由于以前使用的 Firebase Dynamic Links 服务,并且最近登录后发现弃用提示。发现提供了数据导出的功能,所以就导出了历史数据。

Firebase Dynamic links 导出截图

这里可以用脚本将导出的数据的真实地址一条条的转换成 commit message ,然后提交到 GitHub 仓库中。

但是之前的路径是不一样,所以我们可以痛过 tag 来实现一一对应。就像这样:

使用 tag 迁移历史短网址

如上操作后,我们就可以通过 tag 或分支名来实现语义化的路径

总结

用 SHA-1 值作为路径,虽然不是最短的短网址,但是可以保证唯一性。

加上之前网络上出现过一篇名为 《 Anyone can Access Deleted and Private Repository Data on GitHub 》 的文章,说的是即便删除了有关分支和 tag 依然可以通过 api 获取到提交的信息。微软回应这是设计如此。

所以我们在仓库只要有 push 过的提交,都可以通过 SHA-1 值来获取到提交信息。也就是说,这个基于 SHA-1 值的短网址服务是可以永久保留的。

缺点

说完我们的骚操作,也要说说缺点。

  1. 由于每一个真实网址都是一个提交,所以会导致仓库的提交记录非常多,不利于查看。 (可以通过 tag 或分支名来实现语义化的路径)
  2. 因为 GitHub 仓库是公开的,所以短网址也是公开的,不适合敏感信息。
  3. 由于是通过 404 页面实现跳转,所以会有一定的延迟。
  4. 404 页使用了 GitHub api ,所以会存在一定的请求次数限制。

以上,这是一个玩具~

试试看文中提到的短网址

第 1 条附言  ·  2025 年 1 月 18 日

方案是借鉴 https://github.com/ant-design/u.ant.design 的。

如评论区说的,直接写在一个 map 里面就好了。

但是我没有这么做是想到 sha-1 是唯一的,并且不可以修改。写 map 可以随时修改,看喜好

另外说一下 fork 我的这个仓库是不行的,我在文章中提到的 《 Anyone can Access Deleted and Private Repository Data on GitHub 》https://trufflesecurity.com/blog/anyone-can-access-deleted-and-private-repo-data-github 这篇文章可以了解一下。

⚠️⚠️ 简单来说你 fork 后 push 了一条 message 的 sha-1 为 5c94 (来自评论区的 http://307.run/5c94) ,但是你再用我的自定义二级域名也可以跳 https://link.wxhboy.cn/5c94 到目标位置...

So~

大家 fork 我的 repo 后就属于团伙了, 按需的玩哈,或者参考 u.ant.design 自己维护一个 map 也行。

66 条回复    2025-01-23 23:21:21 +08:00
nagisaushio
    1
nagisaushio  
   2025 年 1 月 17 日
天才!
hellodigua
    2
hellodigua  
   2025 年 1 月 17 日
太骚了这操作,想都想不到
evan1
    3
evan1  
PRO
   2025 年 1 月 17 日
这不是天才是什么!
tutouguai
    4
tutouguai  
   2025 年 1 月 17 日
难你天?
abinnz
    5
abinnz  
   2025 年 1 月 17 日
办法不错,就是有安全风险,泄露 GITHUB_TOKEN
SoyaDokio
    6
SoyaDokio  
   2025 年 1 月 17 日
怎一个骚字了得,高,实在是高!
8fQJ4SKWTUrK68eC
    7
8fQJ4SKWTUrK68eC  
   2025 年 1 月 17 日
看不懂,但字多,应该很牛逼!
lijilin92
    8
lijilin92  
   2025 年 1 月 17 日
666
fj19
    9
fj19  
   2025 年 1 月 17 日
这个路子确实有点野
mobile8
    10
mobile8  
   2025 年 1 月 17 日
hhh LGTM
Wvg9eBo3U0c8BLd2
    11
Wvg9eBo3U0c8BLd2  
   2025 年 1 月 17 日
TMD 甘! 你真是一个天才
vampuke
    12
vampuke  
   2025 年 1 月 17 日   ❤️ 2
奇技淫巧
deplives
    13
deplives  
   2025 年 1 月 17 日
你小子还真是个天才
xiaowoli
    14
xiaowoli  
   2025 年 1 月 17 日
什么奇技淫巧,你分明就是 甜菜!
asilencebtf
    15
asilencebtf  
   2025 年 1 月 17 日
woc 难他天
musi
    16
musi  
   2025 年 1 月 17 日 via iPhone
啊? 这? 啊?
Leung818
    17
Leung818  
   2025 年 1 月 17 日
我?六!
suhu
    18
suhu  
PRO
   2025 年 1 月 17 日
```json
{
"message": "API rate limit exceeded for ****. (But here's the good news: Authenticated requests get a higher rate limit. Check out the documentation for more details.)",
"documentation_url": "https://docs.github.com/rest/overview/resources-in-the-rest-api#rate-limiting"
}
```

github 是有 rate limiting 的 鉴于机场 ip 万人骑的原因,不建议用于生产(和 OP 说的一样)
suhu
    19
suhu  
PRO
   2025 年 1 月 17 日
@suhu 哦 不好意思,刚刚看到楼主说过这个问题了
kristofer
    20
kristofer  
   2025 年 1 月 17 日
真想看看你的小脑瓜里都在想什么。嘿嘿嘿
dqzby
    21
dqzby  
   2025 年 1 月 17 日
太有意思了
jadehare
    22
jadehare  
   2025 年 1 月 17 日
牛逼,跟当时看到浏览器两个页面用 localstorage 定位一个感觉,骚,牛逼。
hjzx050935
    23
hjzx050935  
   2025 年 1 月 17 日
这个有点好玩
rimwindy
    24
rimwindy  
   2025 年 1 月 17 日
有意思
whoami9426
    25
whoami9426  
   2025 年 1 月 17 日
天才!
fengpan567
    26
fengpan567  
   2025 年 1 月 17 日
出院!!!
macaodoll
    27
macaodoll  
   2025 年 1 月 17 日 via Android
怎一句牛逼能形容的
CoderAdam
    28
CoderAdam  
   2025 年 1 月 17 日
挺有想法的,牛逼!!!
M5tuA
    29
M5tuA  
   2025 年 1 月 17 日
牛逼
96
    30
96  
   2025 年 1 月 17 日
你直接出院。

和这个一起出院: https://blog.muna.uk/archives/shortUrl-vercel.html
guanhui07
    31
guanhui07  
   2025 年 1 月 17 日
牛逼
prosgtsr
    32
prosgtsr  
   2025 年 1 月 17 日
出院!!!
ethusdt
    33
ethusdt  
   2025 年 1 月 17 日 via iPhone
@jadehare 说下这个骚操作
duzhuo
    34
duzhuo  
   2025 年 1 月 17 日
@96 感觉还是楼主这个牛 b
fengmk2
    35
fengmk2  
   2025 年 1 月 17 日
fork 楼主的 repo ,配置了一下,真的可以

http://307.run/5c94
coldle
    36
coldle  
   2025 年 1 月 18 日
看傻了,天才!
ysc3839
    37
ysc3839  
   2025 年 1 月 18 日   ❤️ 2
都用网页跳转了,完全可以把列表写进网页里。
实际上建议用 Vercel 或者 Firebase Function 等 Serverless 服务来跳转,也是直接把链接写进脚本里即可。
lonely701
    38
lonely701  
   2025 年 1 月 18 日   ❤️ 3
奇技淫巧,文化水平还需要提高。
Tianket
    39
Tianket  
   2025 年 1 月 18 日
天才!
timothyye
    40
timothyye  
   2025 年 1 月 18 日 via Android
@lonely701 哈哈哈哈哈就
timothyye
    41
timothyye  
   2025 年 1 月 18 日 via Android
奇淫技巧是什么意思?特别淫荡的技巧?
MEIerer
    42
MEIerer  
   2025 年 1 月 18 日
牛 b
x86
    43
x86  
   2025 年 1 月 18 日
天才,想给你做个免费的开颅手术看看里面都放了啥
HENQIGUAI
    44
HENQIGUAI  
   2025 年 1 月 18 日
确实天才
querysecret
    45
querysecret  
   2025 年 1 月 18 日
SHA1 不是摘要算法吗,摘要算法不是都有可能碰撞吗,是唯一?
wangxiaoer
    46
wangxiaoer  
   2025 年 1 月 18 日
@abinnz #5 这个 token 好像不是必须的?
wangxiaoer
    47
wangxiaoer  
   2025 年 1 月 18 日
@jadehare #22 细说什么情况?
jadehare
    48
jadehare  
   2025 年 1 月 18 日
uds9u32br
    49
uds9u32br  
   2025 年 1 月 18 日
有点意思
bigbigeggs
    50
bigbigeggs  
   2025 年 1 月 18 日
牛逼,sha 是 2dfcb2bec39d48cfad67b574014f71bc869998ce 这么长,怎么确定用哪几位就可以确定唯一一个提交了?
GeruzoniAnsasu
    51
GeruzoniAnsasu  
   2025 年 1 月 18 日
@bigbigeggs OP 的源码直接用 github 的 API 查询的,git 的实现把 hash 作为 refs 路径的一部分,用 trie 管理
Vfei2017
    52
Vfei2017  
   2025 年 1 月 18 日
请教一下,这个的应用场景是什么
qqjt
    53
qqjt  
   2025 年 1 月 18 日
不是哥们
lijianan
    54
lijianan  
   2025 年 1 月 19 日
看不懂,但是小红哥 nb
htccav
    55
htccav  
   2025 年 1 月 19 日
完全看不懂,但是很牛逼
intoext
    56
intoext  
   2025 年 1 月 19 日
纠正,成语是奇技淫巧,不是奇淫技巧
UB
    57
UB  
   2025 年 1 月 19 日
挺有创意的,大哥牛逼
vcbal
    58
vcbal  
   2025 年 1 月 20 日
666,可以可以,感谢楼主分享
phatzhong24
    59
phatzhong24  
   2025 年 1 月 20 日
这是什么应用场景?
ixx
    60
ixx  
   2025 年 1 月 20 日
哈哈哈 原来不只我自己用 404 页面做跳转
我之前做的导航 就是利用 404 页面实现 “域名/任意 github 用户名” 转成“域名/?任意 github 用户名”
这种传参的方式 就可以 实现导航数据托管在用户自己的仓库里 根据名字 拼接取导航数据了
FlyToSKy
    61
FlyToSKy  
   2025 年 1 月 20 日
有点东西
qinyui
    62
qinyui  
   2025 年 1 月 20 日
跟那个用 sleep 排序有的一拼
p1gd0g
    63
p1gd0g  
   2025 年 1 月 20 日
有点意思
Tanix2
    64
Tanix2  
   2025 年 1 月 20 日
思路清奇,不过考虑易用性,还是写个脚本简单,可以自定义路径。我之前发过一个相关的帖子: https://linux.do/t/topic/295282
suofeiya
    65
suofeiya  
   2025 年 1 月 20 日
GitHub 被你玩出花了哈哈.
etata
    66
etata  
   2025 年 1 月 23 日
这尼玛太搞笑了。。。。
关于   ·   帮助文档   ·   自助推广系统   ·   博客   ·   API   ·   FAQ   ·   Solana   ·   2807 人在线   最高记录 6679   ·     Select Language
创意工作者们的社区
World is powered by solitude
VERSION: 3.9.8.5 · 42ms · UTC 12:32 · PVG 20:32 · LAX 04:32 · JFK 07:32
♥ Do have faith in what you're doing.