apache_request_headers PHP () discorda com a realidade (como confirmado pelo Firebug): por quê?

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

Pergunta

Eu escrevi um aplicativo web em PHP que faz uso de requisições Ajax (feito usando YUI.util.Connect.asyncRequest).

Na maioria das vezes, esta multa funciona. O pedido é enviado com um X Solicitado-Com valor de XMLHttpRequest . Meu código controlador PHP usa apache_request_headers () para verificar se uma solicitação de entrada é Ajax ou não e tudo funciona bem.

Mas nem sempre. Intermitentemente, estou ficando uma situação onde a solicitação Ajax é enviado (e confirma Firebug para mim que os cabeçalhos sobre o pedido incluir uma-X Solicitado-Com de XMLHttpRequest), mas apache_request_headers () não está retornando esse cabeçalho em sua lista.

A saída de quando eu var_dump os apache_request_headers () é o seguinte (note a falta de 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)

Mas Firebug diz-me:

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

Esse descompasso é (aparentemente) intermitente ao executar o mesmo código. Mas eu não acredito em "intermitente" quando se trata de software! Ajuda!

Foi útil?

Solução

Eu não tenho certeza por que os apache_request_headers () e descasamento firebug, mas a fim de ler cabeçalhos de solicitação você pode usar o $ _SERVER Super mundial

cada cabeçalho que está sendo enviado por um cliente (e não importa como é o cliente) vai chegar ao array $ SERVER. A chave desse cabeçalho será com HTTP prefixo, todas as letras maiúsculas e traço é convertido para sublinhado (_)

em seu caso, você pode encontrar o seu valor necessário em:

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

Outras dicas

Para referência futura das pessoas que vêm em toda esta questão, o "intermitente" pode ser devido a um redirecionamento acontecendo do lado do servidor. Se ocorrer um redirecionamento 302 do X-Requested-Com cabeçalho não é repassada mesmo que foi enviado na solicitação original. Esta pode ter sido a causa original do problema.

Verifique novamente se o cabeçalho faltando não está no $_SERVER superglobal. Em geral, eu não iria contar com apache_ * se eu realmente tinha que fazer.

Em uma nota lateral, é X-Requested-Com o padrão ainda? Eu li sobre várias bibliotecas adicioná-lo, mas eu não sabia que ele se tornou o padrão ainda.

Eu não posso responder especificamente neste caso, mas, em geral, eu recomendo usar um parâmetro (query) para sinalizar pedidos de XMLHTTP, em vez de um cabeçalho. Você nunca sabe o que a segurança engraçado ou servidor proxy pode tomar a iniciativa de mexer com os cabeçalhos HTTP, ou para armazenar em cache uma resposta AJAX que deveria ter sido uma resposta HTML navegador simples (ou vice-versa).

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top