PHP apache_request_headers()は現実に同意しません(Firebugが確認したとおり):なぜですか?

StackOverflow https://stackoverflow.com/questions/249968

質問

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

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

ただし、常にではありません。断続的に、Ajaxリクエストが送信される状況になっています(FirebugはリクエストのヘッダーにXMLHttpRequestのX-Requested-Withが含まれていることを確認しています)が、apache_request_headers()はそのヘッダーをリストに返していません。 / p>

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

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

役に立ちましたか?

解決

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

クライアントによって送信されている各ヘッダー(およびクライアントがどのように関係ないか)は、$ SERVER配列に到着します。 そのヘッダーのキーにはHTTP プレフィックスが付き、大文字とダッシュはすべてアンダースコア(_)に変換されます

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

$ _ SERVER ['HTTP_X_REQUESTED_WITH'] = 'XMLHttpRequest'

他のヒント

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

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

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

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

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top