我正在寻找一种在空间方面最有效的 url 编码方法。原始二进制文件(base2)可以用 base16 表示,它更小并且是 url 安全的,但 base64 甚至更有效。但是,通常的 base64 编码不是 url 安全的......
那么对于 URLS 也安全的最小编码方法是什么?
这就是Base64 URL 编码变体的用途。
它使用相同的标准 Base64 字母,除了+
更改为-
和/
更改为_
.
大多数现代 Base64 实现将支持这种替代编码。如果你没有,通常只是在解码之前对 Base64 输入进行搜索/替换,或者在将其发送到浏览器之前对输出进行搜索/替换。
您可以使用 62 个字符表示而不是通常的基数 64。这将为您提供类似于 youtube 的 URL: http ://www.youtube.com/watch?v=0JD55e5h5JM
如果您需要将字符串映射到数据库数字 ID,可以使用此页面中提供的 PHP 函数:
http://bsd-noobz.com/blog/how-to-create-url-shortening-service-using-simple-php
如果您需要将数字 ID 直接转换为短 URL 字符串,或者这个:http: //kevin.vanzonneveld.net/techblog/article/create_short_ids_with_php_like_youtube_or_tinyurl/
据我所知,URL 的最佳编码是将“base66”编码为以下字母表:
ABCDEFGHIJKLMNOPQRSTUVWXYZ
abcdefghijklmnopqrstuvwxyz
0123456789-_.~
根据 URI 规范 RFC 3986(第 2.3 节),这些都是“未保留字符”,因此它们将按原样出现在 URL 中。使用这种“base66”编码可以给出如下 URL:
https://example.org/articles/.3Ja~jkWe
那么问题是你是否想要在你.
的~
URL 中?
在一些较旧的服务器上(我猜现在很古老)~joe
意味着joe
该服务器上用户的“www目录”。因此,用户可能会对~
角色在您的 URL 中间所做的事情感到困惑。这对于学术网站很常见,尤其是 CS 教授(例如 Donald Knuth 的网站https://www-cs-faculty.stanford.edu/~knuth/)
但是,在我自己的测试中,以下 14 个其他符号也没有进行百分比编码(在 Chrome 95 和 Firefox 93 中):
!$'()*+,:;=@[]
(另请参阅此 StackOverflow 答案)
留下可能的“base80” URL 编码。其中一些(特别是+
and =
)在 URL 的查询字符串部分中不起作用,仅在路径部分中起作用。总而言之,这最终会为您提供漂亮的超压缩 URL,例如:
https://example.org/articles/1OWG,HmpkySCbBy@RG6_,
https://example.org/articles/21Cq-b6Ud)txMEW$,hc4K
https://example.org/articles/:3Tx**U9X' d;tl~rR]q+
您可能不希望 URL 中包含所有这些符号的原因有很多。一个例子是 StackOverflow 自己的“链接器”不会在它生成的链接中包含结束逗号(我已经手动将其作为链接的一部分)。
百分比编码似乎也很挑剔。在某些情况下,Firefox 最初会进行百分比编码'
,~]
但在以后的请求中不会。