收到客户的来信,我们的密码重置电子邮件通常可以正确生成,但是(用代码表示)如下:
<h4> <a href="https://'.$this->server.'/password?email_token='.$email_token.'&user_email='.$user_email.'">reset here</a></h4>
并且所生成的字符串如下:
https://password/?email_token=111111111111111111111aaaaaaabbbb&[email protected]
最后,这是应该的样子:
https://website.com/password?email_token=111111111111111111111aaaaaaabbbb&[email protected]
这是有趣的部分:
.'/password?
它的产生如下:
password/?
以某种方式生成电子邮件时,将'password'之前的'/'移至密码之后但在'?'之前。
这是一个静态字符串片段,这怎么可能发生?
这是由浏览器(Chrome,FireFox和Edge)中的URL解析引起的问题。我没有测试Opera,但是在Internet Explorer 11中没有发生。
源代码中的实际字符串输出是正确的https:///password??email_token=111111111111111111111aaaaaaabbbb&[email protected]
,但是在单击/鼠标悬停期间,将解析URL以移动多余的/
,因为由于缺少域,它不是有效的URI。
运行下面的代码段以在单击和鼠标悬停时验证URL解析:
<a href="https:///password?email_token=111111111111111111111aaaaaaabbbb&[email protected]">Test</a>
但是,只要提供域,URL便不会更改。
<a href="https://example.com/password?email_token=111111111111111111111aaaaaaabbbb&[email protected]">Test</a>