我用用rawurlencode()编码的令牌发送用户激活的html电子邮件。
所以 - 链接出现在这样的电子邮件中:
<a href="http://site.com/auth?action=confirmActivation&user=79&token=zlKoFo%22f%27g%3FtUb%27%29Z~L1%25zKh%5EG%23_Aj%5Ckbbbd4fdb9121b50f643f12c937ab1c03d5f09861" target="_blank">Click here to activate your account</a>
但是,当我点击此链接时,我的页面网址如下所示:
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
点击后,我的浏览器会自动进行一些转换吗?为什么呢?
答案 0 :(得分:3)
这是因为%5E(^)由PHP进行urlencoded编码(编码除-_之外的所有非alphanum字符)。这不符合RFC。浏览器看到了这一点,并通过解码所有内容来“修复”编码以符合RFC,然后仅编码导致URL出现问题的字符(^不是其中之一)。 php rawurlencode符合RFC标准,但实际上,浏览器本身可能不符合RFC标准,并且可能只编码空格和〜等内容。我建议你只需对你获得的任何标记进行urldecode并使用它结果,无论哪种方式都是一致的。如果你在令牌中有麻烦的字符,base64 encode it来解决这个问题。