我正在处理带有电子邮件确认的自定义页面模板。一切正常,除了当我单击电子邮件中的链接时,它给了我"找不到页面"。
PHP 脚本中有什么问题?
这是代码片段:
ob_start();
$email= '';
if(isset($_POST['submit'])){
if(!($_POST['subscriptions']=="")){
$email= isset($_POST['subscriptions']) ? $_POST['subscriptions'] : '';
function encryptLink($stringValue){
$key = "12345";
$qryStr = "subscriptions=".$stringValue;
$query = base64_encode(urlencode(mcrypt_encrypt(MCRYPT_RIJNDAEL_256, md5($key), $qryStr, MCRYPT_MODE_CBC, md5(md5($key)))));
$link = 'www.example.com/testEnvironment/confirmation/'.$query;
return $link;
}
$string = $email;
$pagelink = encryptLink($string);
//Email Details
$mail_to = $email;
$from_mail = "dummyemail@example.com";
$from_name = "";
$reply_to = "";
$subject = "Confirmation";
$message_body =
'Hey,
<span style="overflow-wrap: break-word; word-wrap: break-word;">'.$pagelink.'</span>';
//Generate a boundary
$boundary = md5(uniqid(time()));
//Email Header
$header = "From: ".$from_mail." 'r'n";
$header .= "Reply-To: ".$reply_to."'r'n";
$header .= "MIME-Version: 1.0'r'n";
$header .= "Content-Type: multipart/mixed;'r'n";
$header .= " boundary='"".$boundary."'"";
//Multipart wraps the Email Content
$message_body .= "'r'n'r'n";
$message_body .= "--".$boundary."'r'n";
$message_body .= "Content-Type: text/html; charset='"iso-8859-1'"'r'n";
$message_body .= "Content-Transfer-Encoding: 7bit'r'n";
$message_body .= "'r'n";
$message_body .= "$message_body'r'n";
$message_body .= "--".$boundary."'r'n";
//Send email
if (mail($mail_to, $subject, $message_body, $header)){
echo "Sent";
} else {
echo "Error";
}
}
}
确认页面 PHP 代码段:
$key = "12345";
$queryString = rtrim(mcrypt_decrypt(MCRYPT_RIJNDAEL_256, md5($key), urldecode(base64_decode($_SERVER['QUERY_STRING'])), MCRYPT_MODE_CBC, md5(md5($key))), "'0");
parse_str($queryString);
if(!empty($stringValue)){
echo $stringValue;
} else{
exit("Invalid parameters passed");
}
我认为问题是您正在使用服务器未准备好的链接 - base64 编码字符串似乎是生成的 url 中的一个页面或目录,因为它是随机的将不存在 - 因此需要在 php 中重写规则和相关逻辑。
在 htaccess 文件中,也许有这样的规则:
RewriteEngine On
RewriteBase /testEnvironment/
RewriteRule ^confirmation/([a-zA-Z0-9_-]+)$ confirmation/index.php?data=$1 [NC,L]
/* this will need to be adjusted to your url - is it simply confirmation.php or other? */
注意data
!
<?php
if( $_SERVER['REQUEST_METHOD']=='GET' && isset( $_GET['data'] ) ){
$data=$_GET['data'];
$key = "12345";
$queryString = rtrim( mcrypt_decrypt( MCRYPT_RIJNDAEL_256, md5( $key ), urldecode( base64_decode( $data ) ), MCRYPT_MODE_CBC, md5( md5( $key ) ) ), "'0");
/* there is no return value from parse_str() so you would need to manually retrieve the variables to find `subscriptions` */
parse_str( $queryString );
/* does this show anything ? */
print_r( $queryString );
/*
if(!empty( $stringValue )){
print_r( $stringValue );
} else{
exit("Invalid parameters passed");
}
*/
}
?>
My test environment
-------------------
## .htaccess ##
RewriteEngine On
RewriteBase /
RewriteRule ^stackconfirm/([a-zA-Z0-9_-]+)(/)?$ /test/stackconfirm.php?data=$1 [NC,L]
/* PHP script to generate email and confirmation link*/
function encryptLink( $stringValue ){
$key = "12345";
$qryStr = "subscriptions=".$stringValue;
$query = base64_encode( urlencode( mcrypt_encrypt( MCRYPT_RIJNDAEL_256, md5( $key ), $qryStr, MCRYPT_MODE_CBC, md5( md5( $key ) ) ) ) );
/* for my test I changed this portion to match url structure on test server */
$link = '/stackconfirm/'.$query;
return $link;
}
$link=encryptLink('bobby.dazzler@razzledazzle.com');
echo "<a href='$link'>Click here to confirm membership</a>";
stackconfirm.php
----------------
<?php
if( $_SERVER['REQUEST_METHOD']=='GET' && isset( $_GET['data'] ) ){
$data=$_GET['data'];
$key = "12345";
$queryString = rtrim( mcrypt_decrypt( MCRYPT_RIJNDAEL_256, md5( $key ), urldecode( base64_decode( $data ) ), MCRYPT_MODE_CBC, md5( md5( $key ) ) ), "'0");
echo '<pre>', $data, PHP_EOL, print_r( $queryString,true ), '</pre>';
}
?>
Result
------
subscriptions=bobby.dazzler@razzledazzle.com
您直接将密钥与确认 URL 连接起来。它始终会导致 404 错误页面,因为链接不存在。相反,您可以通过 get 请求获取查询,并在确认脚本中对其进行处理,如下所示。
$link = 'www.example.com/confirmation/?key='.$query;
在确认脚本中,通过 get 方法获取查询,如下所示。
$key=$_GET['key'];
让原始密钥存储为$original_key=12345;
现在检查传递的密钥是否与原始密钥相似
if($key==$original_key)
{
//confirm e-mail
}
else
{
//invalid key
}