简单实现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 结尾!

原理看下图:

点击看大图
关键在于.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 真好用啊~~
9 Responses to “简单实现tinyurl.com类短网址服务”
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 LinuxApril 26th, 2010 at 16:56
Hi~ 嗯,我明白的意思,如果纯粹给当前这博客做个短网址你说的完全可行。不过,其实我写这个cmprzurl的目的不是为了给我博客弄个短网址,是想在我的域名下实现缩短网址的服务,给别的长网址弄个短的。
嘿嘿。
Reply
晴明 Reply:
Internet Explorer 7.0 Windows 7April 26th, 2010 at 16:59
嗯 是我误解了
Reply
vvoody Reply:
Opera 9.80 LinuxApril 26th, 2010 at 18:39
嘿嘿,你的想法也不错阿,可以写个wp的插件
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 LinuxApril 26th, 2010 at 22:47
一般短网址实现都是对网址进行hash。正向的话一个hash一个压缩,但反向展开短网址时hash优势明显阿,直接取就行了。压缩的还得解压。
不过这个想法还是有点意思~
Reply
By Vince Delmonte on Jul 28, 2010
Internet Explorer 8.0 Windows 7 Internet Explorer 8.0 Windows 7I have searched all over google for info on this topic, I finally found a good post, looking forward to coming back!
Reply
By ghd on Jul 30, 2010
Mozilla Firefox 3.6.3 Windows XP Mozilla Firefox 3.6.3 Windows XPi 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