【问题标题】:When is a 404 not a 404?什么时候404不是404?
【发布时间】:2011-09-06 09:02:54
【问题描述】:

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

但是,使用 Chrome 的 javascript 控制台,它在我尝试加载的 php 文件上报告“404 未找到”。虽然,我可以直接加载文件,只需从控制台中单击文件即可。

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

这是 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);
}

这里是源文件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;
?>

【问题讨论】:

  • 那肯定有很多标签。
  • 我想我会对标签感到厌烦。我想我是浏览器“打包老鼠”:-)
  • 你可能想看看你的情况是否和this one类似。
  • 为什么地址如此秘密?你应该比较这两个地址。顺便说一句$.get('&lt;?php echo get_bloginfo('template_directory') ?&gt;... 这看起来真的很难看。你不应该像这样将 javascript 与 php 混合使用。
  • @Jamie:chrome 内置了一些非常好的开发者工具。点击ctrl-shift-i 将它们提出来。

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


【解决方案1】:

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

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

【讨论】:

  • 这解释了很多。谢谢蒂姆。很有帮助。
【解决方案2】:

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

【讨论】:

  • 服务器应该发送一个带有 404 错误的文档 — 它应该说明找不到该页面,并可能提供一个操作过程(“我找不到 / foo,但我知道 /food,这是相似的,你是说这个吗?这是一个链接“)。有时,服务器会严重配置错误,以至于它会为所有内容发送 404。
  • 感谢 Waldheinz。标题说同样的话:状态代码:404 Not Found
  • 我并不是真的在抱怨浏览器报告 404 的事实。只是想确定原因,以便我可以修复它。虽然我可以在 jQuery get 之外执行完全相同的 URL 而没有得到 404,这似乎很奇怪,但 jQuery get 中有一些东西导致了 404,对吧?
  • @Scott B - 导致 404 的不是 jQuery $.get - 它是返回它的 Web 服务器。如果有响应内容,浏览器仍会显示 404 页面。但是,$.get 会触发 error 方法而不是 success 方法,并且您只提供了 success 方法。
  • @scott:检查服务器的访问日志并比较命中。 jquery 版本和您的“手动执行”命中之间一定存在一些差异。
【解决方案3】:

HTTP 404 来自响应的标头 - 可以有响应内容(通常是“哎呀,我们找不到它”消息),但如果它很小,它会被某些浏览器忽略(IE 是否有自己的消息小 404)。

我的猜测是服务器正在将 404 HTTP 状态标头添加到 colorReset.php - 这是 PHP/您使用的任何服务器的问题,而不是 jQuery。

jQuery 的 $.get 方法仅在您从服务器返回 HTTP 200 状态时触发 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 可能有错误或服务器配置可能有误。

【讨论】:

  • 非常有帮助的基思。我想你已经让我克服了这个困难。
  • 基思,你走对了。我已经删除了 php 中的一些调用,它不再返回 404。我现在在 colorReset.php 上被隔离来解决。感谢您潜入!
  • @Scott B - H2H。也看看@Tim Stone 的回答 - 我认为他是对的:require_once('../../../wp-blog-header.php'); 发现 colorReset.php 不是 WordPress 的一部分,因此将 HTTP 状态标头设置为 404。
  • 感谢您指出这一点。不知道为什么我没有看到他的原始评论,但它对问题的原因很准确。
【解决方案4】:

因为根据官方文档 $.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');
    }
  }
});

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

【讨论】:

    【解决方案5】:

    这个文件在同一个目录吗?

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

    【讨论】:

    • 是的,colorReset.php和调用文件在同一个目录。
    【解决方案6】:

    也许 colorReset.php 正在创建 404 是因为您缺少一些参数还是因为它是星期三?关键是任何 php 脚本都可以出于编码人员希望的任何原因发出 404。此脚本在星期三发送 404:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-03-15
      • 1970-01-01
      • 2021-09-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-08-04
      相关资源
      最近更新 更多