简单实现tinyurl.com类短网址服务

May 10th, 2009 | by vvoody |

常用Twitter或者饭否之类服务的朋友都应该知道tinyurl的大名吧~ 简言之就是将长长的网址缩短,变成这个样子:http://tinyurl.com/qn8v7y

如果在自个儿的域名上实现一下类似的服务,应该很好玩~ 现在我已经做好了,只需4个文件配合即可工作,有兴趣的朋友可以继续往下看。测试方法,在浏览器中输入 http://vvoody.org/cmprzurl.py?longurl=http://vvoody.org/blog/?p=265 ,在longurl=后添上你想缩短的地址即可得到一个短网址。这篇文章缩短后的地址就是:http://vvoody.org/baJjPy 哈哈真巧,Py 结尾!

cmprzurl-example

原理看下图:
structure_of_cmprzurl
点击看大图

关键在于.htaccess规则,它负责重写地址。比如我的域名 http://vvoody.org/ 下面有 blog 等目录和文件,得保证这些能正常访问,也得把 3pHj9A 这样的字符串交给后台脚本处理。这个.htaccess规则之前我写了一堆正则,却都无法满足上述要求,后来在这篇文章中找到了方法,就两条,Apache 很好很强大!

curl -I http://vvoody.org/baJjPy 可以看到 Location 头部已经是转向网址了。不过返回的http头信息不是转向网站的,虽然不影响转向,但总觉得不太好。这方面我实在不懂,希望有朋友能帮我解决这个问题 ;-)

服务器端要求:
* Apache 2.0 以上并支持.htaccess和python cgi; [2.0.63]
* SQLite3; [3.2.1]
* Python; [2.3.5]
* pysqlite2 或 sqlite3 Python模块; [??]

方括号里是我的服务器端情况。

总结:
由于后端程序采用CGI的方式(非mod_python),使用 SQLite 这种非C/S数据库,以及我对web编程和数据库操作方面知识很浅,因此在性能、并发处理上不会达到很高的要求。

这个东西仅仅是给自个儿玩啦 ;-) 路过大牛轻拍,也欢迎指点任何程序设计、安全、配置等上的问题。

如果你也有自己的域名和空间,那么只要把上图中的 cmprzurl.py, redirect.py, cmprzurl.db, .htaccess 复制到你域名的根目录下,赋上可执行权限,就可以了。文件请从下面的地址检出。

PS:
Google docs 里的 drawing 真好用啊~~

源代码在这里:
http://github.com/vvoody/cmprzurl/tree/master

  1. 9 Responses to “简单实现tinyurl.com类短网址服务”

  2. By 晴明 on Apr 26, 2010

    Internet Explorer 7.0 Windows 7 Internet Explorer 7.0 Windows 7

    我设想的是可以更短 而且不需要额外的数据记录

    其实这样的url形式已经是有这样的目的了
    http://vvoody.org/blog/?p=265
    你如果把它写成
    http://vvoody.org/265
    完全比
    http://vvoody.org/baJjPy 更短吧,而且并不需要太多额外的处理

    我们假设文章的id是顺序存储的,那么只需要用冗余最少的信息来描述这个id即可
    冗余最少当然是直接用数字id来描述 但还要考虑占位最少 那么需要创造比十六进制更大的进制
    理论上最多的应该就是使用所有能显示的iso8859的字符吧
    简单起见,即便只用数字和大小写字母,这就已经创造了62进制,2位就能达到近4k,这已经够个人blog使用了吧
    需要做的就是把archive的id和大数进制之间的互相转换 这是完全的双映射 这样就省掉了comprzurl模块

    Reply

    vvoody Reply:

    Mozilla Firefox 3.6.3 Linux

    Hi~ 嗯,我明白的意思,如果纯粹给当前这博客做个短网址你说的完全可行。不过,其实我写这个cmprzurl的目的不是为了给我博客弄个短网址,是想在我的域名下实现缩短网址的服务,给别的长网址弄个短的。

    嘿嘿。

    Reply

    晴明 Reply:

    Internet Explorer 7.0 Windows 7

    嗯 是我误解了

    Reply

    vvoody Reply:

    Opera 9.80 Linux

    嘿嘿,你的想法也不错阿,可以写个wp的插件 ;-)

  3. By 晴明 on Apr 26, 2010

    Internet Explorer 7.0 Windows 7 Internet Explorer 7.0 Windows 7

    再仔细想想
    这其实就是个文本无损压缩的应用

    使用数据库存储,实际上就是基于字典的压缩算法

    不知道用哈夫曼编码之类的算法对url压缩效果如何。。。

    Reply

    vvoody Reply:

    Mozilla Firefox 3.6.3 Linux

    一般短网址实现都是对网址进行hash。正向的话一个hash一个压缩,但反向展开短网址时hash优势明显阿,直接取就行了。压缩的还得解压。

    不过这个想法还是有点意思~

    Reply

  4. By Vince Delmonte on Jul 28, 2010

    Internet Explorer 8.0 Windows 7 Internet Explorer 8.0 Windows 7

    I have searched all over google for info on this topic, I finally found a good post, looking forward to coming back!

    Reply

  5. By ghd on Jul 30, 2010

    Mozilla Firefox 3.6.3 Windows XP Mozilla Firefox 3.6.3 Windows XP

    i believe you are a good writer, but have you erver thought to write some special rtcals for peopel who likes shopping very much wansantg2zxy.

    Reply

  1. 1 Trackback(s)

  2. May 14, 2009: vvoody’s woody house » Blog Archive » 乌龙

Post a Comment