URL缩短:最佳编码方法?

时间:2010-03-03 23:55:46

标签: php encoding base64 url-shortener

我正在创建一个链接缩短服务,我正在使用增量ID字段的base64编码/解码来创建我的URL。 ID为“6”的网址为:http://mysite.com/Ng==

我还需要允许用户创建自定义网址名称,例如http://mysite.com/music

到目前为止,这是我的(可能是错误的)方法。帮助修复它将不胜感激。

当有人创建新链接时:

  • 我从数据库中获取最大的链接ID(它不是自动递增的)
  • 将ID增加1
  • 通过base64_encoding生成一个简短的URL代码(http://website.com/[short网址名称))ID
  • 插入链接表:id,short_url_code,destination_url

当有人创建新链接并传递自定义短网址时

  • 我的计划是base64_decode他们的自定义字符串并使用它作为链接ID,但我没有意识到你不能只是base64_decode任何字母数字字符串并将其变成一个数字。

是否有更好的编码方法可以让我将任何数字转换为短字符串,将任何字符串转换为数字,这样我就可以通过将名称转换为数字并查询来查找短网址(无论是自定义还是自动生成)对于ID等于该号码的链接?

2 个答案:

答案 0 :(得分:11)

首先,确保您在IDshort_url_code列上确实存在

当有人创建新链接时:

  1. 从数据库中获取下一个最大的链接ID出于性能原因,您应该真正使用autoincrementSEQUENCE ,具体取决于您的RDBMS提供的内容;否则请选择MAX(ID)+1
  2. 使用http://website.com/[short url name]任何其他自定义或标准编码方案,从ID生成一个简短的网址代码(base64_encode
  3. 插入links表:ID, short_url_code, destination_url
  4. 如果插入因违反约束而失败,请返回步骤1尝试新的ID;你可能有违规行为,因为:

    1. 相同的ID已被另一个线程/进程等并行使用(即插入)(如果您使用autoincrementSEQUENCE,则不会,并且可能经常发生,否则)和/或
    2. 相同的short_url_code已被用作自定义网址(除非有人试图在您的网站上造成问题,否则很少会发生这种情况)
  5. 如果插入成功,则提交并将短URL返回给用户

  6. 当有人创建新链接并传递自定义短网址时

    1. 执行与上述相同的步骤1
    2. ,而不是像上面第2步那样从ID生成短网址部分,使用用户提供的自定义short_url_code
    3. 执行与上述相同的步骤3
    4. 如果插入因以下原因失败:
      1. ID违反约束:返回第1步尝试新的ID
      2. short_url_code上的约束违规:向用户返回错误,要求他选择其他自定义网址,因为他/她提供的短网址已被使用
    5. 执行与上述相同的步骤

答案 1 :(得分:2)

base64可用于制作短网址,但也可以使网址更长。例如,数字1的base64_encode是'MQ ==',是大小的4倍。 Base64总是有2个字符来获得64位,这对于短网址来说并不理想。

如果尺寸是最重要的因素,那么您可以依靠internationalization生成最短的网址。

  

这可以使URI相当长(单个Unicode字符最多9个ASCII字符),但目的是浏览器只需要显示解码后的形式,并且许多协议可以在没有%HH转义的情况下发送UTF-8

请记住,浏览器在使用UTF-8时效果很好,而且这些网址也不会有问题。