5

Ajax リクエスト (YUI.util.Connect.asyncRequest を使用して作成) を使用する Web アプリを PHP で作成しました。

ほとんどの場合、これで問題なく動作します。リクエストはX-Requested-WithXMLHttpRequestで送信されます。私の PHP コントローラー コードは apache_request_headers() を使用して、着信要求が Ajax であるかどうかを確認し、すべてが正常に機能します。

しかしいつもではない。断続的に、Ajax リクエストが送信される状況が発生します (そして、Firebug は、リクエストのヘッダーに XMLHttpRequest の X-Requested-With が含まれていることを確認します) が、apache_request_headers() がそのヘッダーをリストに返していません。

apache_request_headers() を var_dump したときの出力は次のとおりです (X-

'Host' => string 'peterh.labs.example.com' (length=26)
'User-Agent' => string 'Mozilla/5.0 (X11; U; Linux i686; en-GB; rv:1.9.0.3) Gecko/2008101315 Ubuntu/8.10 (intrepid) Firefox/3.0.3' (length=105)
'Accept' => string 'text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8' (length=63)
'Accept-Language' => string 'en-gb,en;q=0.5' (length=14)
'Accept-Encoding' => string 'gzip,deflate' (length=12)
'Accept-Charset' => string 'ISO-8859-1,utf-8;q=0.7,*;q=0.7' (length=30)
'Keep-Alive' => string '300' (length=3)
'Connection' => string 'keep-alive' (length=10)
'Referer' => string 'http://peterh.labs.example.com/qmail/' (length=40)
'Cookie' => string 'WORKFLOW_SESSION=55f9aff2051746851de453c1f776ad10745354f6' (length=57)
'Pragma' => string 'no-cache' (length=8)
'Cache-Control' => string 'no-cache' (length=8)

しかし、Firebug は次のように教えてくれます。

Request Headers:
Host             peterh.labs.example.com
User-Agent       Mozilla/5.0 (X11; U; Linux i686; en-GB; rv:1.9.0.3) Gecko/2008101315 Ubuntu/8.10 (intrepid) Firefox/3.0.3
Accept           text/html,application/xhtml+xml,application/xml;q=0.9,**;q=0.8
Accept-Language  en-gb,en;q=0.5
Accept-Encoding  gzip,deflate
Accept-Charset   ISO-8859-1,utf-8;q=0.7,*;q=0.7
Keep-Alive       300
Connection       keep-alive
X-Requested-With XMLHttpRequest
Referer          http://peterh.labs.example.com/qmail/
Cookie           WORKFLOW_SESSION=55f9aff2051746851de453c1f776ad10745354f6

この不一致は、同じコードを実行するときに (明らかに) 断続的です。しかし、ソフトウェアに関して言えば、「間欠的」は信じていません。ヘルプ!

4

4 に答える 4

7

apache_request_headers() と firebug が一致しない理由はわかりませんが、リクエスト ヘッダーを読み取るために $_SERVER スーパー グローバルを使用できます

クライアントによって送信される各ヘッダー (クライアントがどのようなものであるかは問題ではありません) は、$ SERVER 配列に到着します。そのヘッダーのキーは HTTPプレフィックスであり、すべての文字の大文字とダッシュはアンダースコア (_) に変換されます

あなたの場合、次の場所で必要な値を見つけることができます。

$_SERVER['HTTP_X_REQUESTED_WITH'] = 'XMLHttpRequest'

于 2008-10-30T13:57:22.410 に答える
1

この質問に出くわした人の将来の参考のために、「断続的」はサーバー側で発生するリダイレクトが原因である可能性があります。302 リダイレクトが発生した場合、X-Requested-With ヘッダーは、元の要求で送信されていても渡されません。これが問題の元の原因である可能性があります。

于 2010-03-24T17:19:51.197 に答える
0

このケースについて具体的にお答えすることはできませんが、一般的には、ヘッダーの代わりに (クエリ) パラメーターを使用して xmlhttp リクエストを通知することをお勧めします。HTTP ヘッダーをいじったり、プレーンなブラウザーの HTML 応答であるはずの AJAX 応答をキャッシュしたり (またはその逆) するために、おかしなセキュリティ サーバーやプロキシ サーバーがそれを自ら引き受ける可能性があることはわかりません。

于 2008-10-30T14:11:10.730 に答える
0

欠落しているヘッダーがスーパーグローバルにないことを再確認してください$_SERVER。一般に、本当に必要な場合は apache_* に依存しません。

余談ですが、X-Requested-With はまだ標準ですか? それを追加するさまざまなライブラリについて読んだことがありますが、それがまだ標準になっていることを知りませんでした。

于 2008-10-30T13:54:28.343 に答える