【问题标题】:Escaping of rails-generated URL转义 Rails 生成的 URL
【发布时间】:2015-08-08 14:58:15
【问题描述】:

我在创建链接以重置密码时遇到问题。我的电子邮件视图中有以下内容:

<%= link_to "Reset password", edit_password_reset_url(@user.reset_token,
                                  email: @user.email) %>

生成到日志中的链接是

<a href=3D"http://localhost:3000/password_resets/RtukKzGZ9U8HOaHyipTmYw/e=
dit?email=3Demail%40gmail.com">Reset password</a>

链接的转义似乎不正确(我有这个“3D”和一个“=”,它们被错误地添加到 URL 中)。结果,当我将链接粘贴到浏览器中时,我收到“找不到路由”错误。如果我手动将链接更改为

http://localhost:3000/password_resets/RtukKzGZ9U8HOaHyipTmYw/e
dit?email=email%40gmail.com

该链接将起作用。有谁知道为什么转义不正确以及如何纠正它?我对其他链接生成过程(例如帐户激活)使用了非常相似的语法,但我没有收到此错误。谢谢。

【问题讨论】:

标签: ruby-on-rails


【解决方案1】:

QP 通过使用等号“=”作为转义字符来工作。它还将行长限制为 76,因为某些软件对行长有限制。 -- Quoted Printable

也许您是直接从电子邮件源获取引用的可打印 HTML。你看到的实际上是根据Quoted Printable 转义的,它将特殊字符编码为=XX,其中XX 是十六进制的字符代码点。此外,行尾的等号将丢弃以下新行,因为行长度限制为 76 个字符。

我认为您不必关心这一点,因为这是有意的,并且只要您的邮件标题中有 Content-Transfer-Encoding: quoted-printable,它是引用可打印电子邮件所必需的。

这是一个真实世界示例的源代码,来自 Dropbox 的一封电子邮件。

MIME-Version: 1.0
From: Dropbox <no-reply@dropboxmail.com>
To: xxxxxx@gmail.com
Subject: =?utf-8?q?Upgrade_your_Dropbox!?=
Date: Sat, 8 Aug 2015 11:59:03 +0000
Message-ID: <0000000000@email.amazonses.com>
Content-Type: text/html; charset="utf-8"
MIME-Version: 1.0
Content-Transfer-Encoding: quoted-printable

<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN" "http://www.w=
3.org/TR/REC-html40/loose.dtd">
<html xmlns=3D"http://www.w3.org/1999/xhtml"><head><meta content=3D"text/ht=
ml; charset=3Dutf-8" http-equiv=3D"Content-Type"><style> 

.....(snip).....

【讨论】:

  • 我的理解是,当像我一样使用命名路由时,Rails 会自动转义任何特殊字符(例如电子邮件地址的“@”正确翻译成“%40”)。但是,会进行额外的编码,例如“编辑”一词中间的“=”和电子邮件地址之前的“3D”。两者都使 URL 无效,我认为它们不应该存在。
  • @Bastien 只要您在邮件中使用Content-Transfer-Encoding: quoted-printable,由于引用可打印,所有= 都必须编码为=3B。能否请您发布电子邮件的完整来源(尤其是标题)而不是您认为不正确的部分?
  • 其实你是对的。我更仔细地查看了编码,确实它是不同的。这是我收到的错误电子邮件的标题----==_mimepart_55c625918863_36e23fd63959670410839 Content-Type: text/html; charset=UTF-8 内容传输编码:引用打印。而这是我为正确的电子邮件 Content-Type: multipart/alternative;边界="--==_mimepart_55c6278251959_36e23fd624acaf3c11347"; charset=UTF-8 Content-Transfer-Encoding: 7bit 所以现在的问题是如何将编码从quoted-printable 更改为7bit?
  • @Bastien 您可能有字符(例如特殊符号、表情符号或 CJK 字符)无法用7bit 编码表示,因此它升级为quoted-printable。这种编码对于大多数电子邮件客户端来说都很好。为什么必须使用7bit
  • @Bastien 将 Unicode 兼容的编码转换为非 Unicode 兼容的编码在 2015 年并不是那么好。
猜你喜欢
  • 1970-01-01
  • 2011-08-06
  • 1970-01-01
  • 2014-06-20
  • 1970-01-01
  • 2013-09-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多