什么时候404不是404?

Posted

技术标签:

【中文标题】什么时候404不是404?【英文标题】:When is a 404 not a 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 将它们提出来。 【参考方案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");

【讨论】:

以上是关于什么时候404不是404?的主要内容,如果未能解决你的问题,请参考以下文章

环境配好了却报404

在SEO过程中,如何避免网站中出现软404

为啥 Spring Boot Actuator 返回 404 而不是 401?

404页面做好后,在iis设置404的url 为啥蜘蛛索引不存在的页面的时候返回的是200啊,我应该如何设置404

Django 渲染模板 `500.html` 而不是 `404.html`

木材是不是有像 404 一样的默认 500 模板?