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

时间:2010-08-10 00:55:31

标签: jquery ajax wordpress

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

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

6 个答案:

答案 0 :(得分:47)

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

其中一个是$wp->query_posts(),调用$wp_the_query->query(),后者又调用WP_Query的{​​{1}}函数。我怀疑在那里生成了404指示(你的AJAX页面不是WP帖子,或类似的东西),后来被parse_query()转换为实际的404响应头,$wp->handle_404()query_posts()之后调用的函数。

我不是百分之百确定main()是明确的罪魁祸首,但我建议你看看是否可以只包括parse_query(),因为我相信它可以完成创建对象的实际工作你想要访问的。

同样,我实际上并没有使用WordPress,所以我无法确定,但从源代码看,这似乎是最可能的情况,从我所知道的。

答案 1 :(得分:3)

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

我只是在ajax.php

的顶部添加了解决方法
header('Response: HTTP/1.1 200 OK');

有点黑客,但它有效。

答案 2 :(得分: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

答案 3 :(得分:1)

总的来说,WordPress没有大量的地方会返回404.我建议为这些地方点击源树,并放置一些调试代码来追踪它为什么会发生。

答案 4 :(得分:0)

根据Tim的回答,我在我的插件中将我从“wp”捕获的钩子改为“init”,它停止给我404.

答案 5 :(得分:0)

我遇到了同样的问题。

修复。

更改:

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标头错误。

相关问题