从客户处收到此消息后,我们的密码重置电子邮件通常可以正确生成,但是(以代码形式)如下所示:
<h4> <a href="https://'.$this->server.'/password?email_token='.$email_token.'&user_email='.$user_email.'">reset here</a></h4>
生成的字符串如下:
https://password/?email_token=111111111111111111111aaaaaaabbbb&user_email=info@mail.com
最后,它应该是这样的:
https://website.com/password?email_token=111111111111111111111aaaaaaabbbb&user_email=info@mail.com
这是有趣的部分:
.'/password?
它的生成如下:
password/?
以某种方式生成电子邮件时,将'password'之前的'/'移至密码之后,但移至'?'之前
这是一个静态字符串片段,这怎么可能发生?
答案 0 :(得分:1)
这是由客户端(Chrome,FireFox,Edge以及可能的其他客户端解释器,例如Outlook)中的URL解析引起的问题。我没有测试Opera,但是在Internet Explorer 11中没有发生。
有关更多详细信息,请参见:https://webkit.org/blog/7086/url-parsing-in-webkit/
URL解析也可以通过发送或接收MTA来应用,例如; postfix,gmail,office.com等。但是,我对postfix和gmail的测试并没有改变电子邮件的源代码。
我们需要知道您的服务器配置和收件人的MTA才能进行验证。
PHP源代码和结果HTML中的实际字符串输出符合预期
https:///password?email_token=111111111111111111111aaaaaaabbbb&user_email=info@mail.com
由于它不是有效的URI,由于缺少$this->server
提供的域,因此有问题的客户端将解析URL并移动多余的/
。
运行以下代码段,以在浏览器中单击和鼠标悬停时体验URL解析:为简洁起见,缩短了URL参数。
<a href="https:///password?email_token=1">Test</a>
使用new URL()
时,在Javascript中可能会遇到相同的行为。
var url = 'https:///password?e=1';
var u = new URL(url);
window.alert('Original: ' + url + "\nParsed: " + u.href);
但是,只要提供域,URL便不会更改。
<a href="https://example.com/password?email_token=1">Test</a>