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

6 浏览
0 Comments

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

我通过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

这个不包含wp-blog-header.php并返回Firebug中的200 OK的PHP的响应头...

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

0
0 Comments

问题出现的原因是在使用jQuery的Ajax方法时,返回了404错误,但实际上返回的是正确的响应。解决方法是将wp-blog-header.php替换为wp-load.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

0
0 Comments

问题原因:在WordPress模板中添加了一个ajax.php文件,但是出现了404错误。这个问题之所以出现是因为没有正确设置HTTP响应头。

解决方法:在ajax.php文件的顶部添加以下代码:

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

这个方法可能有点绕,但是它确实能解决问题。需要注意的是,这行代码应该放在包含wp-header.php文件之后。

最后,作者表示尝试了将这行代码放在顶部和底部,但是并没有起作用。最终问题得到解决,谢谢大家的时间和耐心。

0
0 Comments

问题出现的原因:包含了wp-blog-header.php文件,这会启动整个WordPress设置流程。其中调用了wp()函数,它又调用了$wp->main()函数,进而调用了各种设置函数。其中之一是$wp->query_posts()函数,它调用了$wp_the_query->query()函数,而后者又调用了WP_Queryparse_query()函数。我怀疑404错误是在这个过程中生成的(因为你的AJAX页面不是一个WordPress文章,或者其他类似的东西),并且稍后通过$wp->handle_404()函数将其转化为实际的404响应头。

解决方法:尝试将wp-blog-header.php替换为wp-load.php,因为我相信后者才是真正创建你想要访问的对象的工作。

以上是我根据源代码的分析得出的最可能的情况,但我不能百分之百确定,因为我实际上并不使用WordPress。

评论区的回答:

- "我实际上并不使用WordPress",我使用,并且显然你对WordPress比我了解得多...你太棒了!

- Tim和Mike,你们俩都太棒了!:) 我刚开始调试这个问题,就找到了你们的答案。这肯定会花费一些时间,而我正好赶在截止日期前。

- 你的答案完全正确,并且对我有用,非常感谢!

0