Ajax 调用 php 脚本返回 404 错误

Posted

技术标签:

【中文标题】Ajax 调用 php 脚本返回 404 错误【英文标题】:Ajax call to php script returns 404 error 【发布时间】:2011-08-11 06:12:32 【问题描述】:

我是一名 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 脚本并发送电子邮件。

当我用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>';
    

?>

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

【问题讨论】:

你能添加接收这个ajax请求的文件的代码吗? AJAX 调用应始终具有响应正文。当请求结束但没有收到数据时,一些浏览器会感到困惑。只需在最后回显“OK”或“ERROR”或其他内容。任何事物。也便于调试。 Rudie 完全正确 - 如果我只返回某种数据,过去我可以避免无数问题。最糟糕的是,我知道许多插件和库依赖于返回的数据而不是响应代码(例如,malsup 的表单插件)。如果您不想返回结构化 XML/JSON,请始终返回至少一个字符。另外 - 我们有没有机会在某个 URL 上看到这一点? @Rudie,@Lev,谢谢。实际上,您可以在 $mail->Send(); 之后看到一条响应消息有 echo $success_message;它被返回,但它没有显示出来,因为 ajax 的成功处理程序在 404 错误后失败。如果这不是你的意思,请告诉我。 @mobi 你说得对!我看到 $success_message 不是空的。使用 Firebug 或 Chrome Inspector(或其他开发工具),你能看到整个响应吗?必须有一个 HTTP 代码和标头以及(可能)一个正文。即使有(服务器)错误。与我们分享? =) 【参考方案1】:

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

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

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

【讨论】:

你就是男人!谢谢。在echo $success_message; 之前添加header('HTTP/1.1 200 OK'); 可以解决问题,尽管我无法弄清楚404 错误来自哪里。由于某种原因,第一个建议导致返回的消息没有插入到页面中,因此没有显示出来。 谢谢,我很高兴它有效。 404 是在 Wordpress 的某个地方发送的……不知道 Wordpress,所以不知道为什么 =) WP 中的 template_redirect 无故发送 404。谢谢大佬! 添加header('HTTP/1.1 200 OK'); 仍然适用于在 2014 年遇到同样问题的人 :) 我在 WordPress 环境中的客户端 Godaddy 服务器上遇到了这个问题。 那是我所需要的!谢谢!【参考方案2】:

我猜这是因为 Wordpress 已经内置了 AJAX 机制,它会阻止您自己实现它。本页介绍了如何将 AJAX 添加到插件:

http://codex.wordpress.org/AJAX_in_Plugins

这是来自页面的 sn-p:


管理端的 Ajax

由于 Ajax 已经内置到核心 WordPress 管理屏幕中,因此向您的插件添加更多管理端 Ajax 功能相当简单,本节将介绍如何操作。

这是一个简短的例子。所有这些都将在一个文件中。

首先,添加一些将触发 AJAX 请求的 javascript

<?php
add_action('admin_print_scripts', 'my_action_javascript');

function my_action_javascript() 
?>
<script type="text/javascript" >
jQuery(document).ready(function($) 

    var data = 
        action: 'my_action',
        whatever: 1234
    ;

    // since 2.8 ajaxurl is always defined in the admin header and points to admin-ajax.php
    $.post(ajaxurl, data, function(response) 
        alert('Got this from the server: ' + response);
    );
);
</script>
<?php

然后,设置一个处理该请求的 PHP 函数:

<?php 

    add_action('wp_ajax_my_action', 'my_action_callback');

    function my_action_callback() 
    global $wpdb; // this is how you get access to the database

    $whatever = intval( $_POST['whatever'] );

    $whatever += 10;

    echo $whatever;

    die(); // this is required to return a proper result

就是这样!您需要添加一些细节,例如错误检查和验证请求是否来自正确的位置(使用 check_ajax_referer() ),但希望上面的示例足以让您开始使用自己的管理端 Ajax 插件. 注意:从 2.8 版开始,可以使用 javascript 全局变量 ajaxurl,以防您想将 javascript 代码从 php 文件分离到仅 javascript 文件中。这只适用于管理方面。

【讨论】:

【参考方案3】:

如此处https://cooltrainer.org/fixing-false-404-headers-on-external-pages-including-wp-blog-header-php/ 所见,此解决方案经过测试并且运行良好:

require_once("path/to/wp-config.php");
$wp->init();
$wp->parse_request(); 
$wp->query_posts();
$wp->register_globals(); 
$wp->send_headers();

【讨论】:

完美运行,就我而言,这是唯一可行的解​​决方案。【参考方案4】:

在不深入研究问题的情况下,您可能会检查 ajax 请求是否确实在您认为的地方进行。这里可能发生了几件事,例如服务器设置为将任何请求重定向到 /wp-content/ 其他地方。

使用 firebug 捕获一些标头信息,也许还有 livehttp 标头。

【讨论】:

感谢@Cthos,使用firebug,标头信息显示没有问题网址正确。 当您收到 404 时,它是否告诉您某种重定向?你能在问题服务器上手动点击页面吗? 不,没有重定向,我得到这样的结果: POST http://www.somedomain.net/wp-content/themes/themename/lib/scripts/sendEmail.php STATUS 404 not成立。网址是正确的。直接访问时,也会返回 404(有时)。 那么是的,听起来服务器对你做了一些疯狂的事情。如果你可以访问它的 conf 文件,我会检查 .htaccess 中的重定向,并确保文件权限设置正确。

以上是关于Ajax 调用 php 脚本返回 404 错误的主要内容,如果未能解决你的问题,请参考以下文章

带有 WCF 调用的 Ajax 返回 404 错误

从 ajax 调用 webservice asmx 返回 404 错误

为啥我的路线返回 404 错误 Laravel?

Ajax 在 Laravel 8 中返回 404 错误但路由存在

将 URL 作为发布数据传递时,jQuery ajax 返回 404 错误

调用 CodeIgniter 控制器方法返回 404