Ajax调用php脚本返回404错误

mob*_*obi 12 php ajax wordpress jquery http-status-code-404

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

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

$('.submitemail') .click(function() {

    //VALIDATION CODE GOES HERE

    if ( /*VALIDATED SUCCESSFULLY*/ ) {


        $.ajax({
            type: 'POST',
            url: templatePath+'/lib/scripts/sendEmail.php',
            data: 'visitorname=' + visitorname + '&visitoremail=' + visitoremail + '&visitormessage=' + visitormessage,

            success: function(contactResults) {
                //SUCCESS CODE
            }

        });
    }
});
Run Code Online (Sandbox Code Playgroud)

笔记:

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

问题:

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

当我用firebug检查为什么没有触发成功处理程序时,firebug显示"找不到404错误",这就像是一个误报.

可能的原因:

我认为某些服务器配置为阻止此类ajax调用.

这个奇怪的问题可能是什么原因造成的?怎么解决?

提前致谢.

@nowk:sendEmail.php代码是:

<?php 
// Code for loading WordPress environment goes here //

$themeName_optionTree = get_option('option_tree');

$name = trim($_POST['visitorname']);
$email = $_POST['visitoremail'];
$message = $_POST['visitormessage'];


$site_owners_email = $themeName_optionTree['owner_email'];
$site_owners_name = $themeName_optionTree['owner_name'];
$email_subject = $themeName_optionTree['email_subject'];
$success_message = '<p class="success-box">' . $themeName_optionTree['success_message'] . '</p>';

if (strlen($name) < 2) {
    $error['name'] = 1; 
}

if (!preg_match('/^[a-z0-9&\'\.\-_\+]+@[a-z0-9\-]+\.([a-z0-9\-]+\.)*+[a-z]{2}/is', $email)) {
    $error['email'] = 1;    
}

if (strlen($message) < 2) {
    $error['message'] = 1;
}

if (!$error) {

    require_once('PHPMailer_v5.1/class.phpmailer.php');

    $mail = new PHPMailer(true);

    try {
        $mail->From = $email;
        $mail->FromName = $name;
        $mail->Subject = $email_subject;
        $mail->AddAddress($site_owners_email, $site_owners_name);
        $mail->Body = $message;
        $mail->Send();
        echo $success_message;
    } catch (phpmailerException $e) {
        echo '<p class="warning-box">' . $e->errorMessage() . '</p>';
    } catch (Exception $e) {
        echo '<p class="warning-box">' . $e->getMessage() . '</p>';
    }
}
?>
Run Code Online (Sandbox Code Playgroud)

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

Rud*_*die 28

由于服务器发送404(上帝知道是什么原因),有两种方法可以解决/规避这个问题:

  1. 忽略HTTP响应代码并更改successcompletejQuery ajax调用,以便在请求完成时执行处理程序,无论服务器响应如何.您知道服务器响应(它始终有效).HTML应该仍然可以在jQuery complete处理程序中使用.
  2. 覆盖的东西通过执行服务器(可能是一些WordPress的)上发送(404 之前打印任何输出): header('HTTP/1.1 200 OK').由于脚本被执行,这将覆盖疯狂的404,jQuery将接收200并执行success处理程序.

你可以尝试两个=)我很确定第一个会工作(但那不是那么干净).我也很确定第二个会工作,但我不知道Wordpress是否足以做出承诺=)