代码之家  ›  专栏  ›  技术社区  ›  egrunin

替代电子邮件发送长网址?

  •  2
  • egrunin  · 技术社区  · 14 年前

    我有一个Web应用程序使用的URL如下所示:

    http://library.example.com/Register.aspx?query=academic&key=586c70bb-5683-419c-aae9-e596af9ab66a

    (使用guid而不是简单的int来阻止猜测,这是我们现在所需要的。)

    问题是:当通过电子邮件发送时,长的URL经常中断。是人类发送电子邮件,所以我无法控制格式。有时是发送电子邮件的程序出错,有时是接收,但不管我花太多时间在通过解决问题与人交谈。

    所有东西都必须来自这个领域,所以我不能使用第三方缩短。我可以自己主持,但这似乎是个蹩脚的选择。

    有什么建议吗?

    编辑

    @桑尼:谢谢你的阐述,但我的情况与你的假设不同。一个公司客户(我的)将这个URL传递给它的员工,他们使用它来访问一个品牌注册页面。他们需要提供一封工作电子邮件作为注册的一部分,并将其转发给公司主管。

    注册使他们能够访问数据库,但他们看到的并不特定于公司客户。所以偶尔的入侵者不是什么大问题,当他们被公司主管除名后,我们邀请他们订阅。

    @所有人:邮件破损是 关于标点符号( ?&= ,但在预定的线路长度。我也很惊讶。请注意,域名很长,虚拟目录的路径也很长,这是问题的一部分。

    在阅读了答案之后,我将使用base64作为伪缩短器,比如:

    http://a.MyLongDomainName.com/?q=a&key=base64_encoded_GUID

    …看看是否还存在。谢谢大家。

    7 回复  |  直到 9 年前
        1
  •  4
  •   craftworkgames    9 年前

    你至少可以把它缩短一点。现在,您将发送一个guid,它是一个128位的数字,格式基本上是十六进制的,带有额外的破折号。如果您以字节数组的形式查看guid并将其转换为base64,那么您可以将其减少一点。同样,“query=academic”可以是“q=a”。

    GUID当前占用36个字符。转换成base-64可以将此值减少到22,节省14个字符。将“query=academic&key=”替换为“q=a&k=”将另外13个剃掉。总共剪切27个字符可能会使您的URL足够短,不会换行,尽管存在符号和等号。

    还有一个细节:base-64文本将以“=”结尾,然后十六进制编码到“%3d”。解决方案是把这个字符去掉,因为它只是填充。

    考虑到最初的海报,最好的选择似乎是多种因素的结合:

    1. 具有base-64的压缩GUID。
    2. 缩短键名和值(如果可能)。
    3. 将URL用大括号括起来,以鼓励客户机正确地分析它。
    4. 如果可能,用URL重写替换键名,使其看起来像一个路径。
        2
  •  2
  •   Jacob Krall    14 年前

    如果您不能使用第三方URL缩短器,那么您唯一的选择(除了更改URL结构,如Sunny建议的那样)是用尖括号包围您的URL,如下所示:

    <http://library.YourDomainNameHere.com/Register.aspx?query=academic&key=586c70bb-5683-419c-aae9-e596af9ab66a>
    

    任何遵循指南的电子邮件客户端 Uniform Resource Identifiers (URI): Generic Syntax 文档应显示可单击的链接。然而,这不是一个简单的解决方案,您最终可能会求助于一个URL缩短服务或重新构建您的URL。

        3
  •  1
  •   Unicron    14 年前

    安装自己的缩短器服务(这将是IMO的理想解决方案)的唯一选择可能是 base64 对整个URL进行编码(并使用较短的键)。但这会增加33%的字符串长度(很可能会破坏电子邮件客户机),而且看起来很难看。

    我将继续构建一个URL缩短服务,该服务根据需要将URL缩短为如下所示:

    http://library.example.com/go/586c70bb-5683-419c-aae9-e596af9ab66a
    
        4
  •  0
  •   Chase Florell    14 年前

    有一些预打包的URL缩短器,您可以自己托管。这是一个密码丛搜索
    http://www.codeplex.com/site/search?query=url%20shortener
    这将使您能够将短URL保留在内部

    或者,您可以使用一些方法来实现一个RESTful URL,这很难搞砸。
    http://library.example.com/Register/Academic/586c70bb-5683-419c-aae9-e596af9ab66a
    这个解决方案应该比查询字符串更有效,因为电子邮件客户端中通常中断的是 ? , the = &

    我个人认为一个RESTful解决方案是最好的,因为它创建了最干净的URL,仍然有一些“意义”。

        5
  •  0
  •   realworldcoder    14 年前

    用youtube风格的键替换guid怎么样

    例如 http://library.example.com/Register.aspx?q=academic&k=jkGlkNu8

    通过使用base-64字符串(而不是base-16的guid)并删除那些讨厌的破折号,您可以将一系列合适的唯一键打包成少量字符。

        6
  •  0
  •   Krumelur    14 年前

    这里描述的方法组合如何?

    将较短的URL与密钥的base64编码结合起来会使

    http://library.example.com/Register.aspx?query=academic&key=586c70bb-5683-419c-aae9-e596af9ab66a

    进入之内

    http://l.example.com/register/ac/WGxwu1aDQZyq6eWWr5q2ag

    更具可读性,IMO。而且缺少像这样的字符?减少剪切粘贴错误的风险。

        7
  •  0
  •   Sunny    14 年前

    REST ful URL如下:

    http://www.yourdomainhere.com/register/academic/ {UsReMeNexIn }

    也许会帮助IMO.

    如果用户未注册,将执行此操作并返回确认事实的消息

    如果用户已注册,则不会有任何操作,可能会显示用户已注册的通知。

    URL的路由和/或验证请求等实现细节最好留给查看请求管道的模块…

    Hth.

    编辑:

    正如@steven在下面指出的,这个解决方案涉及到一个附加步骤:

    当用户单击REST URL时,启动确认/登录屏幕,并预先填充用户名。用户可以登录到帐户,这是用户有效的确认。在他第一次登录之前,帐户的状态可以是“未确认”&在他第一次登录时,如果单击/请求来自发送的电子邮件和/或通过Web浏览器中的请求,则可以是“已确认”,而不必担心。

    这也将确保它对真实的电子邮件帐户有效,因为在用户实际进行有效登录之前,该帐户不会处于“已确认”状态…