【问题标题】:php url encode issuephp url编码问题
【发布时间】:2011-10-14 18:45:46
【问题描述】:

我在用户激活时使用我用 rawurlencode() 编码的令牌发送 html 电子邮件。

所以 - 链接出现在电子邮件中,如下所示:

<a href="http://site.com/auth?action=confirmActivation&amp;user=79&amp;token=zlKoFo%22f%27g%3FtUb%27%29Z~L1%25zKh%5EG%23_Aj%5Ckbbbd4fdb9121b50f643f12c937ab1c03d5f09861" target="_blank">Click here to activate your account</a>

但是当我点击这个链接时,我的页面 url 看起来像这样:

http://site.com/auth?action=confirmActivation&user=79&token=zlKoFo%22f%27g%3FtUb%27%29Z~L1%25zKh^G%23_Aj%5Ckbbbd4fdb9121b50f643f12c937ab1c03d5f09861

所以 - 之前的令牌(这是它在我的电子邮件中的显示方式):

zlKoFo%22f%27g%3FtUb%27%29Z~L1%25zKh%5EG%23_Aj%5Ckbbbd4fdb9121b50f643f12c937ab1c03d5f09861

之后的令牌:

zlKoFo%22f%27g%3FtUb%27%29Z~L1%25zKh^G%23_Aj%5Ckbbbd4fdb9121b50f643f12c937ab1c03d5f09861

看起来我的浏览器在我点击时会自动进行一些转换?为什么?

【问题讨论】:

    标签: php urlencode rawurl


    【解决方案1】:

    这是因为 %5E (^) 正在由 PHP 进行 urlencoded(它对除 -_ 之外的所有非字母字符进行编码)。这不符合 RFC。浏览器看到这一点,并通过解码所有内容“修复”编码以符合 RFC,然后仅对导致 URL 问题的字符进行编码(^ 不是其中之一)。 php rawurlencode 符合 RFC,但实际上,浏览器本身可能不符合 RFC,并且可能只对空格和〜等内容进行编码。我建议您只需对您获得的任何令牌进行 urldecode 并使用该结果,无论哪种方式,这都是一致的。如果令牌中有麻烦的字符,请base64 encode it 解决。

    【讨论】:

    • 我发送的令牌符合 RFC 3986。当我点击浏览器时,它会使其“不兼容”。
    • 我想我明白了:我的令牌,虽然符合 RFC 3986 (url) 标准,但确实包含 html 特殊字符:%22 是“。这样,如果我发送文本电子邮件而不是html 的。
    • 浏览器在href标签内遇到html特殊字符,并正确地将它们转换为实际字符。
    • 我想如果我会使用 html 电子邮件 - 我必须使用 base64(url 版本)作为我的令牌。该死的
    猜你喜欢
    • 2015-12-09
    • 1970-01-01
    • 2010-11-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-03-26
    相关资源
    最近更新 更多