11

我正在尝试开发一个 URL 缩短器应用程序来练习 Django。我不明白如何为每个长 URL 创建唯一字符串以用作短 URL。像其他流行的 URL 缩短器一样。我怎样才能做到这一点?是否可以制作相同长度的所有短网址?

4

6 回答 6

12
  1. 我不明白如何为每个长 URL 创建唯一字符串以用作短 URL。像其他流行的 URL 缩短器一样。
    正如 sugerman 所说,这很简单,您只需创建一个哈希表。

  2. 我怎样才能做到这一点?
    有一些动态的方法可以做到这一点,但最简单和最有效的方法是在数据库中有一个 2 字段表,其中包含 hashkey 和完整 url。然后,您的服务器(如 Apache)将能够重定向到正确的页面。

  3. 是否可以制作相同长度的所有短网址?
    是的,在某种程度上,但是一旦达到最大数量的键,您将不得不重用/替换短 url ID。当您设置固定长度时,您将限制可能性的数量。

我对你的问题:

我假设URL shortener您指的是 jsFiddle 或 pastebin 之类的东西,因为它们具有类似http://jsfiddle.net/sdfj2/. 否则,我们需要更多的澄清。

于 2010-11-01T04:28:35.187 回答
9

您可能想要创建一个简单的数据库表,将一个短值映射到一个 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]
于 2010-11-01T04:29:13.083 回答
3

我写了上面链接的博客文章。基本上,我是如何做到的如下:

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.

于 2010-11-02T12:00:31.040 回答
2

您可能想要设置一个散列函数来生成缩短的 URL。

编辑:

与其坐在这里为您总结一篇非常详细的 Wikipedia 文章,不如在这里提供一篇博客文章的链接,该链接解释了哈希函数如何与您的确切主题(URL 缩短器)相关联。

于 2010-11-01T04:19:53.287 回答
2

检查django-shorturls应用程序。

于 2010-11-01T05:43:46.277 回答
0

Here is my take on it: https://github.com/bitmazk/django-tinylinks One client is using this in production since one year.

于 2013-04-12T02:13:06.883 回答