簡體   English   中英

Ajax調用php腳本返回404錯誤

[英]Ajax call to php script returns 404 error

我是一名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,上面的代碼也能完美執行,很奇怪吧!

由於服務器發送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管理屏幕中,因此向插件添加更多管理端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文件。 僅在管理方面這是事實。

如此處所示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頭。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM