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

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

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

写在前面哈

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

实现

  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     1369 人在线   最高记录 6679       Select Language
创意工作者们的社区
World is powered by solitude
VERSION: 3.9.8.5 29ms UTC 23:55 PVG 07:55 LAX 16:55 JFK 19:55
Do have faith in what you're doing.
ubao msn snddm index pchome yahoo rakuten mypaper meadowduck bidyahoo youbao zxmzxm asda bnvcg cvbfg dfscv mmhjk xxddc yybgb zznbn ccubao uaitu acv GXCV ET GDG YH FG BCVB FJFH CBRE CBC GDG ET54 WRWR RWER WREW WRWER RWER SDG EW SF DSFSF fbbs ubao fhd dfg ewr dg df ewwr ewwr et ruyut utut dfg fgd gdfgt etg dfgt dfgd ert4 gd fgg wr 235 wer3 we vsdf sdf gdf ert xcv sdf rwer hfd dfg cvb rwf afb dfh jgh bmn lgh rty gfds cxv xcv xcs vdas fdf fgd cv sdf tert sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf shasha9178 shasha9178 shasha9178 shasha9178 shasha9178 liflif2 liflif2 liflif2 liflif2 liflif2 liblib3 liblib3 liblib3 liblib3 liblib3 zhazha444 zhazha444 zhazha444 zhazha444 zhazha444 dende5 dende denden denden2 denden21 fenfen9 fenf619 fen619 fenfe9 fe619 sdf sdf sdf sdf sdf zhazh90 zhazh0 zhaa50 zha90 zh590 zho zhoz zhozh zhozho zhozho2 lislis lls95 lili95 lils5 liss9 sdf0ty987 sdft876 sdft9876 sdf09876 sd0t9876 sdf0ty98 sdf0976 sdf0ty986 sdf0ty96 sdf0t76 sdf0876 df0ty98 sf0t876 sd0ty76 sdy76 sdf76 sdf0t76 sdf0ty9 sdf0ty98 sdf0ty987 sdf0ty98 sdf6676 sdf876 sd876 sd876 sdf6 sdf6 sdf9876 sdf0t sdf06 sdf0ty9776 sdf0ty9776 sdf0ty76 sdf8876 sdf0t sd6 sdf06 s688876 sd688 sdf86