我正在尝试开发一个 URL 缩短器应用程序来练习 Django。我不明白如何为每个长 URL 创建唯一字符串以用作短 URL。像其他流行的 URL 缩短器一样。我怎样才能做到这一点?是否可以制作相同长度的所有短网址?
6 回答
我不明白如何为每个长 URL 创建唯一字符串以用作短 URL。像其他流行的 URL 缩短器一样。
正如 sugerman 所说,这很简单,您只需创建一个哈希表。我怎样才能做到这一点?
有一些动态的方法可以做到这一点,但最简单和最有效的方法是在数据库中有一个 2 字段表,其中包含 hashkey 和完整 url。然后,您的服务器(如 Apache)将能够重定向到正确的页面。是否可以制作相同长度的所有短网址?
是的,在某种程度上,但是一旦达到最大数量的键,您将不得不重用/替换短 url ID。当您设置固定长度时,您将限制可能性的数量。
我对你的问题:
我假设URL shortener
您指的是 jsFiddle 或 pastebin 之类的东西,因为它们具有类似http://jsfiddle.net/sdfj2/
. 否则,我们需要更多的澄清。
您可能想要创建一个简单的数据库表,将一个短值映射到一个 URL。
您可以生成的最简单的短网址只是一个序列号或自动增量列(分配第一个值 1,然后是 2,依此类推)
可以使所有 URL 的长度都相同,直到您没有用完相同长度的值,例如,如果您只使用数字(作为一个简单的示例),它将是从 0000 到 9999。
神奇的部分是您将使用 mod_rewrite 将 url 作为参数传递给脚本,让您的应用程序在 db 中查找值,然后重定向用户。
mod_rewrite 的此重写规则将采用 example.com/0000 之类的 URL 并重定向到 example.com/index.py?id=0000 您可以将其放在 .htaccess 中(我假设您使用的是 apache。)
您的应用程序只需读取 id 并重定向到相关页面。
RewriteRule ^([0-9]+)/?$ index.py?id=$1 [QSA,L]
如果您决定使用散列或简单的 base64 序列号(这将是更紧凑的自动增量),它看起来会略有不同:
RewriteRule ^(.*)/?$ index.py?id=$1 [QSA,L]
我写了上面链接的博客文章。基本上,我是如何做到的如下:
Store the long url in a table with an auto-incrementing index field. Retrieve the index. Convert it to a string, the same way you would convert it to say, a hexadecimal or octal number, but using all available characters as possible "digits". For example, say we have a-z, A-Z, and 0-9 available, do the following:
0 = 0 1 = 1 ... 9 = 9 10 = a 11 = b ... 35 = z 36 = A 37 = B ... 60 = Z 61 = 10 62 = 11 ... 70 = 19 71 = 1a 72 = 1b
You get the pattern? It's a generic conversion algorithm from a base-10 number to a base-n number, where n is the number of characters to your disposal.
检查django-shorturls应用程序。
Here is my take on it: https://github.com/bitmazk/django-tinylinks One client is using this in production since one year.