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

32

我通过jQuery AJAX向PHP脚本发布了一些数据,一切都执行正确,但它返回一个404错误。在我的Firebug控制台中,来自PHP脚本的响应是正确的。我不理解脚本如何回应却仍然抛出404错误。jQuery的“error”回调方法被触发,而“success”方法没有。

所有由PHP脚本执行的语句都很准确,因为我可以看到数据库被更新等操作。

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

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

好吧,我已经发现,当在Ajax脚本中包含WordPress的wp-blog-header.php文件时,就会出现错误。还有,曾经这些脚本能够工作,我90%确定它们在WP 3.0更新后停止工作。我将从Firebug粘贴响应标头。

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

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

请检查 PHP 脚本是否有发送 404 头的行。 - Bang Dao
你应该将这个新发现编辑到你的原始问题中。 - alex
@alex - 刚刚完成了。感谢你的建议和意见。 - Mike McLin
6个回答

48

当您包含 wp-blog-header.php 文件时,您实际上在启动整个 WordPress 设置过程。函数 wp() 会被调用,该函数调用 $wp->main(),后者又会调用各种设置函数。

其中之一是 $wp->query_posts(),它调用 $wp_the_query->query(),后者又调用 WP_Queryparse_query() 函数。我猜测,404 表示是在那里生成的(你的 AJAX 页面不是 WP 文章或任何类似的文章),然后由 $wp->handle_404()main() 中的 query_posts() 后调用,将其转换为实际的 404 响应头。

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

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


3
Tim,我非常爱你,你不知道。这件事困扰了我一段时间。将include改为wp-load.php使得情况有所改善。因此,总而言之,我认为是WordPress升级导致了问题。 - Mike McLin
是的,但愿我早点找到这个。谢谢 Tim! - Scott B
1
我实际上不使用WordPress,而你显然比我更了解它……你太棒了!! - user871784
Tim和Mike,非常感谢你们! :) 当我找到你们的答案时,我刚开始调试这个问题。这肯定需要一些时间,而我又有一个截止日期。 - Abhinav Maheshwari
你的回答完全正确并且对我有用,非常感谢! - technology101010

3
我曾经在 WordPress 模板中添加过一个名为 ajax.php 的文件,遇到了这个问题。
我通过在 ajax.php 文件的顶部添加以下代码简单解决了这个问题。
header('Response: HTTP/1.1 200 OK');

这有点取巧,但它起作用了。


我把它放在 PHP 脚本的顶部和底部,但没有帮助。 - Mike McLin
1
如果我没记错的话,它应该紧跟着你包含 wp-header.php 的位置。 - alex
是的,我尝试过了。还是不行。最终解决了。感谢您的时间和耐心! - Mike McLin

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。

1

总的来说,WordPress 不会返回太多 404。我建议在源代码树中进行搜索这些位置并放置一些调试代码来追踪为什么会发生这种情况。


0

我遇到了同样的问题。

解决方法。

更改:

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

To:

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

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

0

根据Tim的答案,我在我的插件中将我捕获的钩子从“wp”更改为“init”,这样它就不再给我返回404了。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接