問題描述

我通過 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 輔助翻譯的英文資料結果。如果您對結果不滿意,可以加入我們改善翻譯效果:薇曉朵技術論壇。