Когда 404 не 404? - PullRequest
       20

Когда 404 не 404?

8 голосов
/ 01 июня 2011

Я использую этот jQuery ниже, чтобы загрузить файл .php, расположенный на том же сервере.

Тем не менее, используя консоль JavaScript Chrome, его сообщение «404 not found» в php-файле, который я пытаюсь загрузить. Хотя я могу загрузить файл напрямую, просто нажав на файл прямо из консоли.

Кроме того, я могу скопировать URL-адрес файла прямо из консоли javascript, где он сообщает 404 (не найден), открыть новую вкладку, вставить ее в адресную строку и без проблем выполнить скрипт.

Это что-то специфическое для метода get jQuery? Что может вызывать страницу до 404 в методе get, но нормально выполняться при непосредственном вызове?

$('.colorReset').click
    (
        function() 
        {
        var myImage = $('#theme :selected').text();
        $.get('<?php echo get_bloginfo('template_directory') ?>/colorReset.php', {theme: myImage, spot: '1'}, function(data){doColor('#theme_header_color', data);});
        }
    );

    //script never gets to the doColor function, due to the apparent 404 on colorReset.php
function doColor(el, color)
    {
    $(el).val(color).trigger('keyup');
    $(el).attr('value', color);
    $(el).val(color);
}

Here is the javascript console result

I'm able to call the file directly using the same URL the console reports as a 404

Header Report

Вот исходный файл colorReset.php, который вызывается методом get ...

<?php
require_once('../../../wp-blog-header.php');

add_action( 'admin_init', 'check_user' );

function check_user()
    {
    if (!is_user_logged_in()){
        die("You Must Be Logged In to Access This");
    }
    if( ! current_user_can('edit_files')) {
        die("Oops sorry you are not authorized to do this");
    }
}

$myTheme = $_REQUEST['theme'];
$spot = $_REQUEST['spot'];
$myThemeColor = $myTheme."_color".$spot;

$file = "styles/".$myTheme."/template.ini";
    if (file_exists($file) && is_readable($file))
    {
    $ini_array = parse_ini_file($file);
     if($spot == 1){$myColor = $ini_array['color1'];}
     if($spot == 2){$myColor = $ini_array['color2'];}
     if($spot == 3){$myColor = $ini_array['color3'];}
     if($spot == 4){$myColor = $ini_array['color4'];}
    }
    else
    {
     if($spot == 1){$myColor = get_option('theme_header_color');}
     if($spot == 2){$myColor = get_option('theme_sidebar_color');}
     if($spot == 3){$myColor = get_option('theme_spot_color_alt');}
     if($spot == 4){$myColor = get_option('theme_spot_color_alt2');}
    }
echo $myColor;
?>

Ответы [ 6 ]

13 голосов
/ 01 июня 2011

Как описано в другом ответе , загрузка wp-blog-header.php запускает весь процесс обработки запросов WordPress. Учитывая, что ваш скрипт на самом деле не является публикацией WordPress, этот процесс устанавливает заголовок 404, чтобы указать, что он не может найти контент, который вы искали.

Поскольку похоже, что вам действительно нужен просто доступ к пользовательским функциям WordPress, вам лучше просто включить wp-load.php, что должно позволить вам вызывать эти функции без вызова анализатора запросов.

6 голосов
/ 01 июня 2011

Возможно, вы захотите взглянуть на заголовки полученного вами ответа.Нередко отправляют какой-то документ с ответом 404, который может отображать браузер.Но это все равно ответ 404, и JQuery будет воспринимать его как ошибку (которая, по стандарту HTTP, на самом деле).

4 голосов
/ 01 июня 2011

HTTP 404 исходит из заголовка ответа - может быть содержимое ответа (обычно это сообщение «К сожалению, мы не можем его найти»), но некоторые браузеры игнорируют его, если оно маленькое (IE делает свои собственные сообщения для маленький 404).

Полагаю, сервер добавляет заголовок состояния 404 HTTP в colorReset.php - это проблема PHP / любого сервера, который вы используете, а не jQuery.

Метод jQuery $.get запускает функцию success только в том случае, если вы получаете статус HTTP 200 с сервера, в противном случае он запускает функцию error, так что вы все равно можете получить свой цветной шестнадцатеричный код со статусом 404.


Обновление

Я думаю, здесь есть некоторая путаница.

  • HTTP 404 не означает , что ваш браузер не может найти страницу
  • HTTP 404 означает, что сервер (в данном случае Apache) сообщает вам, что не может найти страницу, но все равно возвращает страницу с контентом.

Если вы посетите страницу 404 в своем браузере, она просто загрузит содержимое страницы.

Если вы загрузите страницу 404 с помощью $.get, она запустит назначенный метод error, но конструктор на $.get позволяет только установить метод success.

Ваш jQuery будет работать, если вы сделаете:

var myImage = $('#theme :selected').text();

$.ajax({
    url:     '<?php echo get_bloginfo('template_directory') ?>/colorReset.php',
    data:    {theme: myImage, spot: '1'},
    success: function(data){doColor('#theme_header_color', data);},
    error:   function(data){doColor('#theme_header_color', data);}
});

Однако я бы посмотрел, почему ваш сервер сначала возвращает 404 - colorReset.php может содержать ошибку или неправильную конфигурацию сервера.

2 голосов
/ 01 июня 2011

Так как согласно официальной документации $. Get равно

$.ajax({
  url: url,
  data: data,
  success: success,
  dataType: dataType
});

, на этой странице написано http://api.jquery.com/jQuery.ajax/, что:

Карта числовогоHTTP-коды и функции, вызываемые, когда ответ имеет соответствующий код.Например, следующее будет оповещать, когда статус ответа 404:

$.ajax({
  statusCode: {
    404: function() {
      alert('page not found');
    }
  }
});

Если запрос выполнен успешно, функции кода состояния принимают те же параметры, что и обратный вызов успеха;если это приводит к ошибке, они принимают те же параметры, что и обратный вызов ошибки.

0 голосов
/ 01 июня 2011

Может быть, colorReset.php создает 404, потому что вам не хватает некоторых параметров или потому что сейчас среда? Дело в том, что любой скрипт php может выдать 404 по любой причине, которую пожелает кодер. Этот скрипт отправляет 404 по средам:

$weekday = date('l');
if ($weekday == 'Wednesday') {
  header("HTTP/1.0 404 Not Found");
}
0 голосов
/ 01 июня 2011

этот файл находится в том же каталоге?

если этот файл находится в том же каталоге, то нет необходимости давать обратную косую черту, просто дайте имя файла

...