programing

php 스크립트에 대한 Ajax 호출이 404 오류를 반환합니다.

sourcejob 2023. 3. 5. 09:44
반응형

php 스크립트에 대한 Ajax 호출이 404 오류를 반환합니다.

저는 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
            }

        });
    }
});

주의:

  • send Email을 클릭합니다.php는 PHPmailer 클래스를 사용하여 이메일을 보내는 올바른 스크립트입니다.
  • templatePath 변수에는 다음과 같은 풀템플릿 경로 값이 있습니다.http://somedomain.com/wp-content/themes/themename
  • 위의 jQuery 코드는 lib/scripts/jfunctions.js(ph 스크립트와 동일한 디렉토리)에 있습니다.
  • 전체 프로세스(ajax 및 php)는 많은 서버에서 완벽하게 작동합니다(제가 2대의 서버에서 테스트하고 다른 서버가 테마 사용자가 테스트했습니다).

문제:

일부 서버에서는 ajax가 sendEmail을 호출하는 동안 성공 핸들러가 트리거되지 않습니다.php는 실제로 정상적으로 전달되고 php 스크립트가 처리되어 이메일이 전송됩니다.

firebug에 success 핸들러가 트리거되지 않는 이유를 확인하면 firebug에 "not found 404 error"라고 표시됩니다.이것은 false 알람과 같습니다.

생각할 수 있는 원인:

일부 서버는 이러한 Ajax 콜을 차단하도록 설정되어 있다고 생각합니다.

이 이상한 문제의 원인은 무엇일까요?어떻게 고치죠?

잘 부탁드립니다.

@nowk: send Email.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 를 송신하고 있기 때문에(어떤 이유로) 이것을 수정/회선하는 방법은, 다음의 2가지가 있습니다.

  1. 하고 HTTP를 변경합니다.success로로 합니다.completejQuery ajax 호출에서 서버 응답에 관계없이 요청이 수행될 때 핸들러가 실행되도록 합니다.서버의 응답을 알고 있습니다(항상 동작합니다). HTML jQuery에서 할 수 .complete핸들러
  2. 출력을 인쇄하기 전에 다음을 실행하여 서버(아마 Wordpress)에서 전송되는 404를 덮어씁니다. header('HTTP/1.1 200 OK')하여 crazy 404를 success핸들러

=를 모두 사용해 보십시오.) 첫 번째 것은 분명 작동할 것입니다(하지만 그다지 깨끗하지는 않습니다).나도 2번째가 될거라고 확신하지만 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 글로벌 변수 jajaxurl은 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 헤더를 사용하여 헤더 정보를 캡처합니다.

언급URL : https://stackoverflow.com/questions/5760538/ajax-call-to-php-script-returns-404-error

반응형