问题描述

我通过 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_Queryparse_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 辅助翻译的英文资料结果。如果您对结果不满意,可以加入我们改善翻译效果:薇晓朵技术论坛。