小白写的短网址生成工具 - V2EX
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
请不要在回答技术问题时复制粘贴 AI 生成的内容 #Wrapper { background-color: #e2e2e2; background-image: url("/static/img/shadow_light.png"), url("//cdn.v2ex.com/assets/bgs/circuit.png"); background-repeat: repeat-x, repeat-x; } #Wrapper.Night { background-color: #1f2e3d; background-image: url("/static/img/shadow.png"), url("//cdn.v2ex.com/assets/bgs/circuit_night.png"); background-repeat: repeat-x, repeat-x; background-size: 20px 20px, 162.5px 162.5px; }
InFaNg
V2EX    程序员

小白写的短网址生成工具

  •  
  •   InFaNg 2023-02-06 14:57:25 +08:00 2744 次点击
    这是一个创建于 977 天前的主题,其中的信息可能已经有所发展或是发生改变。
    在家无聊,花了一个月左右的时间学习了 PHP 和一些前端相关的知识,做了这个短网址生成工具,欢迎大家折腾,求 star~~

    后端使用 PHP 实现,前端使用 BootStrap+jQuery
    使用 Nginx/Apache HTTP Server 对短链接重写
    使用 PHP MySQL 预处理语句,有效防止 SQL 注入
    包含安装程序,可图形化配置数据库链接信息
    包含后台管理界面,支持短链接的修改 /删除

    项目地址: https://github.com/caoji2001/short-url
    演示链接: https://go.caoj.org

    运行截图


    14 条回复    2023-12-31 16:59:28 +08:00
    opengps
        1
    opengps  
       2023-02-06 15:05:43 +08:00
    少了最关键的:足够短的域名^^,op 可以去低价买个二手杂米.cc ,别问我是怎么知道的
    RedisMasterNode
        2
    RedisMasterNode  
       2023-02-06 15:10:26 +08:00   1
    $random_number = rand(14776337, 916132832); // [62^4 + 1, 62^5]
    while ($db->where('id', $random_number)->getValue('fwlink', 'count(*)') > 0) {
    $random_number = rand(14776337, 916132832); // [62^4 + 1, 62^5]
    }

    这个方案不会在短连接数量很多的时候产生一些冲突吗,这里大概有 9 亿的可用值,也就是说数据量达到 3 亿左右基本上就有 1/3 的请求会需要查 > 1 次 DB

    另外在访问的时候,相当于所有的访问都要去查询 DB ,即使链接是用户随便输入的

    无恶意纯随便探讨一下,小工具做得挺有意思的页面简洁好看。
    InFaNg
        3
    InFaNg  
    OP
       2023-02-06 15:12:26 +08:00
    @opengps okk !以后我去看看!
    InFaNg
        4
    InFaNg  
    OP
       2023-02-06 15:15:02 +08:00
    @RedisMasterNode 听起来很有道理的样子,当时写这个随机数生成想的有点随意,感觉更合理的方法应该是在数据超过一定阀值后,在更大的范围内生成随机数,之后有空这部分重写下~~
    RedisMasterNode
        5
    RedisMasterNode  
       2023-02-06 15:31:53 +08:00
    @InFaNg 有没有什么更稳定的唯一 ID 生成方案呢,或者你这里已经用了 base62 了,那有没有什么稳定的唯一十进制数生成方案呢,这里的 DB 查询完全可以避开的
    fkdog
        6
    fkdog  
       2023-02-06 15:43:48 +08:00
    好奇现在还有短网址这样的需求么。。?
    duanxianze
        7
    duanxianze  
       2023-02-06 16:03:36 +08:00
    @fkdog 有 主要是发短信太长的参数没法带
    baoei
        8
    baoei  
       2023-02-06 16:06:27 +08:00
    @fkdog 灰产需要
    AoEiuV020CN
        9
    AoEiuV020CN  
       2023-02-06 16:41:27 +08:00
    @fkdog #6 有的,我自己就建了个自己用,
    一些软件配置文件啥的通过短连接固定并缩短,必要的时候可以直接输入,
    原地址太长的只能复制粘贴,换地址了也都得修改配置,有时不方便,
    wonderfulcxm
        10
    wonderfulcxm  
       2023-02-06 16:45:18 +08:00 via iPhone
    @fkdog 有,我们公司网站就有,一是统计,二是可以改短网址对应那个长网址,长网址换了分享出去还能改。
    bearboss
        11
    bearboss  
       2023-02-07 13:49:17 +08:00
    @RedisMasterNode hash 或者随机数都可能碰撞 自增的话区间太明显 容易给别人根据规则遍历短链接 怎么才能完全避免查库呢
    RedisMasterNode
        12
    RedisMasterNode  
       2023-02-07 14:21:29 +08:00   2
    @bearboss 自增区间会有反解的风险但是并不能说太明显

    1. base62 算法你可以自由实现,包括如果不按照 ABC..XYZabc...xyz123..89 这个顺序,如果我将数字安插在不同字母之间作为 base62 算法的 base 呢?只要保证生成和解析是相同即可,不一定是服务外能简单猜测到的排序
    2. 除了单纯的自增,在分布式场景中你的短链生成的机器有非常多,例如 50 个机器,每个机器除了有它自己的号段以外,还需要将机器号埋入 base62 之前的明文,例如我为每台机器分配名字:33869 、22193 这些都是无规则的 ID ,可以进一步混淆 base62 前的明文

    类似的 trick 还可以举例好几种,仍然有反解的风险,但是我理解这个东西得看是否产生价值,如果反解要花很多时间的话那我觉得服务端的目的已经基本达到了
    thinkershare
        13
    thinkershare  
       2023-02-07 16:21:18 +08:00
    国内大部分短信服务商直接不支持短网址动态短信,因为无法审核,就非常的无语。
    tercel36524
        14
    tercel36524  
       2023-12-31 16:59:28 +08:00
    https://www.369url.cn
    这个还是不错的一个选择,
    关于     帮助文档     自助推广系统     博客     API     FAQ     Solana     877 人在线   最高记录 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 21ms UTC 20:38 PVG 04:38 LAX 13:38 JFK 16:38
    Do have faith in what you're doing.
    ubao 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