当前位置: 首页 > 面试题库 >

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

卢枫涟
2023-03-14
问题内容

我是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,上述代码也能完美执行,很奇怪!


问题答案:

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

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

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



 类似资料:
  • 问题内容: 我一直在用这个把头砸在砖墙上,我已经尝试了很多关于stackoverflow的解决方案,但是找不到一个可行的解决方案! 基本上,当我发布我的AJAX时,PHP返回JSON,但AJAX显示的是Undefined而不是值: JS : PHP的 : firebug的JSON结果 : AJAX将JSON结果显示为Undefined,我不知道为什么。我尝试显示添加和。我也曾尝试将其更改为and

  • 问题内容: 我想从PHP脚本返回JSON。 我只是回应结果吗?我必须设置标题吗? 问题答案: 通常,没有它会没事,但是您可以并且应该设置Content-Type标头: 如果不使用特定的框架,通常会允许一些请求参数来修改输出行为。通常,为了快速进行故障排除,不发送标头,或者有时将数据有效载荷print_r盯着它很有用(尽管在大多数情况下,它不是必需的)。

  • 问题内容: 例如我有一个功能: 我怎样才能返回AJAX后得到的? 问题答案: 因为请求是异步的,所以您无法返回ajax请求的结果(而同步ajax请求是一个 糟糕的 主意)。 最好的选择是将自己的回调传递给f1 然后,您将像这样致电:

  • 问题内容: 我一直在用这个把头砸在砖墙上,我已经在stackoverflow上尝试了很多解决方案,但找不到一个可行的方案! 基本上,当我发布我的AJAX时,PHP返回JSON,但是AJAX显示Undefined而不是值: JS : PHP的 : firebug的JSON结果 : AJAX将JSON结果显示为Undefined,我不知道为什么。我尝试显示添加和。我也曾尝试将其更改为and:尽管仍然没

  • 问题内容: 如果PHP脚本在某处失败,是否有办法使PHP返回AJAX错误代码?我正在关注一个教程,并将其输入到我的PHP中: 一切都很好,直到我意识到这是JSON数据。有没有一种方法可以使用标准的$ _POST和返回的HTML数据返回错误(例如,触发jQuery的AJAX 事件? 问题答案: 我不了解jQuery,但是如果它区分成功和失败(HTTP 200 OK vs. HTTP!= 200)Aj

  • 问题内容: 我通过jQuery AJAX将一些数据发布到PHP脚本中,并且一切正常执行,但是返回了404错误。在我的Firebug控制台中,PHP脚本的响应是正确的。我不了解该脚本如何响应,它仍然会引发404错误。jQuery的“错误”回调方法将触发,而“成功”方法则不会触发。 PHP脚本执行的所有语句都能正常工作,因为我可以看到数据库正在更新等。 我在Dreamhost托管的WordPress