对php脚本的Ajax调用返回404错误

我是一名WordPress设计师,我为我的一个主题开发了一个通过jQuery验证的联系表单

请检查下面的代码,然后阅读下面的注释

$('.submitemail')。单击(函数(){
//验证代码在这里
如果(/*验证成功*/){
$.ajax({
键入:“POST”,
url:templatePath+'/lib/scripts/sendmail.php',
数据:“visitorname=”+visitorname+”&visitoremail=”+visitoremail+”&visitormessage=”+visitormessage,
成功:功能(contactResults){
//成功代码
}
});
}
});

注意事项:

  • php是使用PHPmailer类发送电子邮件的正确脚本
  • templatePath变量的值为完整模板路径,如下所示:http://somedomain.com/wp-content/themes/themename
  • 上面的jQuery代码位于lib/scripts/jfunctions.js(与php脚本的目录相同)中
  • 整个过程(ajax和php)在许多服务器上都能像预期的那样完美地工作(由我在两台服务器上测试,由我的主题用户在其他服务器上测试)

问题:

在某些服务器中,当对sendmail.php的ajax调用实际成功传递并且处理php脚本并发送电子邮件时,不会触发成功处理程序

当我检查firebug以了解为什么没有触发成功处理程序时,firebug显示“not found 404 error”,这就像一个假警报

可能的原因:

我认为有些服务器配置为阻止这种ajax调用

这个奇怪问题的原因可能是什么?如何修复它

提前谢谢

@nowk:sendmail.php代码是:

<?php
//加载WordPress环境的代码如下//
$themeName_optionTree=get_option('option_tree');
$name=trim($_POST['visitorname']);
$email=$_POST['visitoremail'];
$message=$_POST['visitormessage'];
$site_owner_email=$themeName_optionTree['owner_email'];
$site_owners_name=$themeName_optionTree['owner_name'];
$email_subject=$themeName_optionTree['email_subject'];
$success_message='<p class=“成功框”>”$themeName_optionTree['success_message'.]&lt/p>';
如果(strlen($name)<2){
$error['name']=1;
}
如果(!preg\u match('/^[a-z0-9&\'.-\+][email protected][a-z0-9\-]+.([a-z0-9\-]+.*+[a-z]{2}/is',$email)){
$error['email']=1;
}
如果(strlen($message)<2){
$error['message']=1;
}
如果(!$error){
需要一次('PHPMailer_v5.1/class.PHPMailer.php');
$mail=新的PHPMailer(true);
试一试{
$mail->发件人=$email;
$mail->FromName=$name;
$mail->主题=$email\u主题;
$mail->AddAddress($site\u owner\u email,$site\u owner\u name);
$mail->正文=$message;
$mail->发送();
回显$success_消息;
}捕获(phpmailerException$e){
echo“<p class=“warning box”>”.$e->errorMessage()。</p>”;
}捕获(例外$e){
echo“<p class=“warning box”>”.$e->getMessage()。</p>”;
}
}
?>

请注意,上面的代码即使在ajax返回404时也能完美执行,奇怪吧

由于服务器发送404(天知道是什么原因),因此有两种方法可以修复/规避此问题:

  1. 忽略HTTP响应代码,并在jQueryAjax调用中将success更改为complete,以便在完成请求时执行处理程序,而不管服务器响应如何。您知道服务器响应(它总是有效的)。HTML应该仍然可以在jQuerycomplete处理程序中使用
  2. 通过执行(在打印任何输出之前)覆盖服务器上发送的404(可能是Wordpress的内容):头('HTTP/1.1 200 OK')。由于脚本被执行,这将覆盖疯狂404,jQuery将收到200并执行success处理程序

你可以两个都试试=)我很确定第一个能用(但那不是很干净)。我也很确定第二个会起作用,但我对Wordpress了解不够,无法做出承诺=)

发表评论