jQuery Ajax 返回 404 错误,但响应正确

Posted

技术标签:

【中文标题】jQuery Ajax 返回 404 错误,但响应正确【英文标题】:jQuery Ajax returning 404 Error, but correct Response 【发布时间】:2011-03-27 14:14:45 【问题描述】:

我通过 jQuery AJAX 将一些数据发布到 php 脚本,一切都正确执行,但它返回 404 错误。在我的 Firebug 控制台中,来自 PHP 脚本的响应是正确的。我不明白脚本如何响应,它仍然抛出 404 错误。 jQuery“错误”回调方法触发,“成功”方法不触发。

PHP 脚本执行的所有语句都能准确运行,因为我可以看到正在更新的数据库等。

我在 Dreamhost 托管的 WordPress 3.x 网站上使用 jQuery 1.4.2。

------------更多信息-----------

好的,我发现当我在 Ajax 脚本中包含 WordPress 的 wp-blog-header.php 文件时,我得到了错误。此外,曾几何时,这些脚本可以工作,我 90% 确信它们在 WP 3.0 更新后停止工作。我将粘贴来自 Firebug 的响应标头。

此来自 PHP 的标头响应包含 wp-blog-header.php 并在 Firebug 中返回 404 错误...

Date                Tue, 10 Aug 2010 01:44:44 GMT
Server            Apache
X-Powered-By        PHP/5.2.6
X-Pingback        http://www.learnwake.com/xmlrpc.php
Expires          Wed, 11 Jan 1984 05:00:00 GMT
Cache-Control       no-cache, must-revalidate, max-age=0
Pragma            no-cache
Last-Modified       Tue, 10 Aug 2010 01:44:44 GMT
Vary                Accept-Encoding
Content-Encoding    gzip
Content-Length    36
Keep-Alive        timeout=2, max=98
Connection        Keep-Alive
Content-Type        text/html; charset=UTF-8

此来自 PHP 的标头响应不包含 wp-blog-header.php 并在 Firebug 中返回 200 OK...

Date                Tue, 10 Aug 2010 01:44:58 GMT
Server            Apache
X-Powered-By        PHP/5.2.6
Vary                Accept-Encoding
Content-Encoding    gzip
Content-Length    36
Keep-Alive        timeout=2, max=100
Connection        Keep-Alive
Content-Type        text/html

【问题讨论】:

如果有一行发送 header 404,请检查 php 脚本 您应该将这个新发现编辑到您的原始问题中。 @alex - 刚刚做了。感谢输入/建议。 span> 【参考方案1】:

当您包含 wp-blog-header.php 时,您最终会引导整个 WordPress 设置例程。函数wp()被调用,它调用$wp->main(),进而调用各种setup函数。

其中之一是$wp->query_posts(),它调用$wp_the_query->query(),而后者又调用WP_Queryparse_query() 函数。我怀疑 404 指示是在其中生成的(您的 AJAX 页面不是 WP 帖子或类似的东西),后来被$wp->handle_404() 转换为实际的 404 响应标头,在main() 中的query_posts() 之后调用的函数。

我不能 100% 确定 parse_query() 是罪魁祸首,但我建议您看看是否可以只包含 wp-load.php,因为我相信它确实可以创建您想要的对象访问。

再说一次,我实际上并没有使用 WordPress,所以我不能确定,但​​从源代码来看,据我所知,这似乎是最有可能的情况。

【讨论】:

蒂姆。我那么爱你,你不知道。这困扰了我一段时间。将包含更改为 wp-load.php 会有所不同。所以,归根结底,我认为是 WordPress 升级导致了问题。 是的,希望我早点找到这个。谢谢蒂姆! “我实际上并没有使用 wordpress”,而且显然你比我知道的更多……你太棒了!! 蒂姆和迈克,爱你们! :) 当我找到你的答案时,刚刚开始调试问题。这肯定需要一些时间,而且是在最后期限内 您的回答完全正确,对我有用,非常感谢!【参考方案2】:

我曾经在 WordPress 模板中添加了一个 ajax.php 文件,但遇到了这个问题。

我只是通过在ajax.php顶部添加来解决它

header('Response: HTTP/1.1 200 OK');

有点像黑客,但它有效。

【讨论】:

我把它放在 PHP 脚本的顶部和底部,但没有帮助。 它应该在你包含 wp-header.php, IIRC 之后。 是的,试过了。仍然没有工作。终于解决了。感谢您的时间和耐心!【参考方案3】:

没有其他人将此作为答案发布,因此值得注意。您应该包括 wp-load.php 而不是 wp-blog-header.php

如果你打开wp-blog-header.php,你就会明白为什么:

if ( !isset($wp_did_header) ) 

    $wp_did_header = true;

    require_once( dirname(__FILE__) . '/wp-load.php' );

    wp();

    require_once( ABSPATH . WPINC . '/template-loader.php' );


如果您只是为 AJAX 操作输出 json,您确实不需要需要包含template-loader.php。这会产生不必要的开销,然后当然会提供 404 错误。

对于当前和未来版本的 WordPress,此“解决方法”是必要的。我假设任何超过 3.0 的内容都应该包括 wp-load.php,如上所述。

【讨论】:

【参考方案4】:

总体而言,WordPress 不会在很多地方返回 404。我建议为这些地方查找源代码树并放置一些调试代码来追踪它发生的原因。

【讨论】:

【参考方案5】:

根据 Tim 的回答,我将插件中捕获的钩子从“wp”更改为“init”,但它不再给我 404。

【讨论】:

【参考方案6】:

我遇到了同样的问题。

修复。

变化:

require_once('wp-blog-header.php');

收件人:

require_once('conn.php');
require('wp-config.php');
$wp->init();
$wp->parse_request();
$wp->query_posts();
$wp->register_globals();

如果你想在 WP 之外有一个页面,这也将修复 HTTP 标头错误。

【讨论】:

以上是关于jQuery Ajax 返回 404 错误,但响应正确的主要内容,如果未能解决你的问题,请参考以下文章

PHP、MySQL、jQuery、AJAX:json 数据返回正确响应但前端返回错误

从 ajax 调用 webservice asmx 返回 404 错误

Web API + jQuery AJAX DELETE 请求返回 404

将 URL 作为发布数据传递时,jQuery ajax 返回 404 错误

为啥即使文件存在于服务器上,jQuery ajax 也会返回 404 Not found 错误?

Ajax 在 Laravel 8 中返回 404 错误但路由存在