jQuery Ajax返回404错误,但是响应正确。
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
问题出现的原因是在使用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
。
问题出现的原因:包含了wp-blog-header.php
文件,这会启动整个WordPress设置流程。其中调用了wp()
函数,它又调用了$wp->main()
函数,进而调用了各种设置函数。其中之一是$wp->query_posts()
函数,它调用了$wp_the_query->query()
函数,而后者又调用了WP_Query
的parse_query()
函数。我怀疑404错误是在这个过程中生成的(因为你的AJAX页面不是一个WordPress文章,或者其他类似的东西),并且稍后通过$wp->handle_404()
函数将其转化为实际的404响应头。
解决方法:尝试将wp-blog-header.php
替换为wp-load.php
,因为我相信后者才是真正创建你想要访问的对象的工作。
以上是我根据源代码的分析得出的最可能的情况,但我不能百分之百确定,因为我实际上并不使用WordPress。
评论区的回答:
- "我实际上并不使用WordPress",我使用,并且显然你对WordPress比我了解得多...你太棒了!
- Tim和Mike,你们俩都太棒了!:) 我刚开始调试这个问题,就找到了你们的答案。这肯定会花费一些时间,而我正好赶在截止日期前。
- 你的答案完全正确,并且对我有用,非常感谢!