小编典典

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

ajax

我是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
            }

        });
    }
});

笔记:

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

问题:

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

当我检查萤火虫以查看为什么未触发成功处理程序时,萤火虫显示“未找到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>';
    }
}
?>

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


阅读 180

收藏
2020-07-26

共1个答案

小编典典

由于服务器发送了404(上帝知道是什么原因),因此有两种方法可以解决/避免这种情况:

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

您可以同时尝试两个=)我很确定第一个可以工作(但这不是很干净)。我也很确定第二个可以工作,但是我对Wordpress的了解还不够,无法做出承诺=)

2020-07-26