什么时候404不是404?

时间:2011-06-01 14:42:30

标签: php jquery apache http-status-code-404

我正在使用此jQuery调用来加载位于同一服务器上的.php文件。

然而,使用Chrome的javascript控制台,它在我试图加载的php文件上报告“404 not found”。虽然,我可以直接加载文件,只需在控制台中单击该文件即可。

另外,我可以直接从报告404(未找到)的javascript控制台复制文件的URL,打开一个新选项卡,将其粘贴到地址栏中,然后点击脚本,没有问题。< / p>

这是jQuery get方法特有的吗?什么可能导致get方法中的页面为404,但直接调用时执行正常?

$('.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 个答案:

答案 0 :(得分:13)

作为described in another answer,加载wp-blog-header.php引导整个WordPress请求处理过程。鉴于您的脚本实际上不是WordPress帖子,此过程设置404标头以指示它找不到您要查找的内容。

由于看起来你真正想要的只是访问WordPress用户函数,你最好只包括wp-load.php,它应该允许你在不调用请求解析器的情况下调用这些函数。

答案 1 :(得分:6)

您可能希望查看收到的回复标题。发送带有404响应的文档并不罕见,浏览器可能会显示该响应。但它仍然是404响应,JQuery会将其视为一个错误(根据它实际上是HTTP标准)。

答案 2 :(得分:4)

HTTP 404来自响应中的标题 - 可能有响应内容(通常是“我们找不到它的Oops”消息)但是如果它很小(IE会自己发送消息,它会被某些浏览器忽略)小404s。)

我的猜测是服务器正在向colorReset.php添加404 HTTP状态标头 - 这是一个PHP /你正在使用的服务器问题,而不是jQuery的。

如果从服务器返回HTTP 200状态,jQuery的$.get方法仅触发success函数,否则会触发error函数 - 因此您仍然可以获得颜色十六进制具有404状态的代码。


<强>更新

我觉得这里有些混乱。

  • HTTP 404 表示您的浏览器无法找到该页面
  • HTTP 404意味着服务器(在本例中为Apache)告诉您无法找到该页面,但它仍然返回包含内容的页面。

如果您在浏览器中访问404页面,则只会加载页面内容。

如果您通过$.get加载404页面,则会触发指定的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可能有错误或者服务器配置可能有误。

答案 3 :(得分:2)

根据uffical文档 $。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');
    }
  }
});

如果请求成功,则状态码函数采用与成功回调相同的参数;如果它导致错误,则它们采用与错误回调相同的参数。

答案 4 :(得分:0)

此文件位于同一目录中?

如果此文件在同一目录中,则无需提供反斜杠,只需提供文件名

答案 5 :(得分:0)

也许colorReset.php正在创建404因为你缺少一些参数或因为它是星期三?重点是任何PHP脚本都可以出于编码器所需的任何原因发出404。这个脚本在星期三发送404:

$weekday = date('l');
if ($weekday == 'Wednesday') {
  header("HTTP/1.0 404 Not Found");
}