问题描述
我通过 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
最佳解决办法
当您包括 wp-blog-header.php
时,您最终将引导整个 WordPress 安装程序。调用 wp()
函数,调用 $wp->main()
,后者又调用各种设置功能。
其中一个是 $wp->query_posts()
,它调用 $wp_the_query->query()
,它又调用 WP_Query
的 parse_query()
功能。我怀疑 404 指示是在那里生成的 (你的 AJAX 页面不是一个 WP 的帖子,或者这样的话),后来被 $wp->handle_404()
转换成了一个实际的 404 响应头,这个函数是 query_posts()
在 main()
中调用的。
我不是 100%肯定 parse_query()
是一个明确的罪魁祸首,但我建议看看是否可以包括 wp-load.php
,因为我相信它是实际的工作,创建您想要访问的对象。
再次,我实际上并没有使用 WordPress,所以我不能肯定,但是看源代码这似乎是最可能的情况,从我能说的。
次佳解决办法
我已经在 WordPress 模板中添加了一个 ajax.php
文件,并出现了这个问题。
我通过在 ajax.php
的顶部添加来解决它
header('Response: HTTP/1.1 200 OK');
一种黑客,但它的工作。
第三种解决办法
没有人发表这个答案,所以值得一提。您应该包括 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' );
}
如果您只输出 json 进行 AJAX 操作,则不需要包含 template-loader.php
。这将产生不必要的开销,然后当然提供 404 错误。
此’workaround’ 是当前和未来版本的 WordPress 所必需的。我假设任何 3.0 以前应该包括 wp-load.php
如所述。
参考文献
注:本文内容整合自 Google/Baidu/Bing 辅助翻译的英文资料结果。如果您对结果不满意,可以加入我们改善翻译效果:薇晓朵技术论坛。