Ajax调用php脚本返回404错误

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

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

$('.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 = '

' . $themeName_optionTree['success_message'] . '

'; if (strlen($name) < 2) { $error['name'] = 1; } if (!preg_match('/^[a-z0-9&\'\.\-_\+]+@[a-z0-9\-]+\.([a-z0-9\-]+\.)*+[az]{2}/is', $email)) { $error['email'] = 1; } if (strlen($message) 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 '

' . $e->errorMessage() . '

'; } catch (Exception $e) { echo '

' . $e->getMessage() . '

'; } } ?>

请注意,即使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是否足以做出承诺=)

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

http://codex.wordpress.org/AJAX_in_Plugins

这是页面的一个片段:


管理方面的Ajax

由于Ajax已内置于核心WordPress管理屏幕中,因此向插件添加更多管理端Ajaxfunction非常简单,本节将介绍如何执行此操作。

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

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

    

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

  

而已! 您需要添加一些细节,例如错误检查和validation请求来自正确的位置(使用check_ajax_referer()),但希望上面的示例足以让您开始使用自己的管理端Ajax插件。 注意:从版本2.8开始,可以使用javascript全局变量ajaxurl,以防您想将javascript代码与php文件分离为仅javascript文件。 仅在管理方面这是事实。

如此处所示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(); 

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

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