什么时候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('<?php echo get_bloginfo('template_directory') ?>...
这看起来真的很难看。你不应该像这样将 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?的主要内容,如果未能解决你的问题,请参考以下文章
为啥 Spring Boot Actuator 返回 404 而不是 401?
404页面做好后,在iis设置404的url 为啥蜘蛛索引不存在的页面的时候返回的是200啊,我应该如何设置404