問題描述

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