PHP apache_request_headers () no está de acuerdo con la realidad (como lo confirma Firebug): ¿por qué?

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

Pregunta

He escrito una aplicación web en PHP que hace uso de solicitudes Ajax (realizadas mediante YUI.util.Connect.asyncRequest).

La mayoría de las veces, esto funciona bien. La solicitud se envía con un valor Solicitado con X de XMLHttpRequest . El código de mi controlador PHP usa apache_request_headers () para verificar si una solicitud entrante es Ajax o no y todo funciona bien.

Pero no siempre. De manera intermitente, recibo una situación en la que se envía la solicitud Ajax (y Firebug confirma que los encabezados de la solicitud incluyen un X-Request-With de XMLHttpRequest) pero apache_request_headers () no devuelve ese encabezado en su lista.

La salida de cuando var_dump apache_request_headers () es la siguiente (note la 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)

Pero Firebug me dice:

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

Esta discordancia es (aparentemente) intermitente cuando se ejecuta el mismo código. Pero no creo en " intermitente " Cuando se trata de software! ¡Ayuda!

¿Fue útil?

Solución

No estoy seguro de por qué apache_request_headers () y firebug no coinciden, pero para leer los encabezados de solicitud puedes usar el $ _SERVER super global

cada encabezado que está siendo enviado por un cliente (y no importa cómo esté el cliente) llegará a la matriz $ SERVER. La clave de ese encabezado será con el prefijo HTTP , todas las letras mayúsculas y guiones se convierten en guión bajo (_)

en su caso, puede encontrar el valor necesario en:

$ _SERVER ['HTTP_X_REQUESTED_WITH'] = 'XMLHttpRequest'

Otros consejos

Para referencia futura de aquellos que se encuentren con esta pregunta, el " intermitente " Puede deberse a un redireccionamiento del lado del servidor. Si se produce un redireccionamiento 302, el encabezado X solicitado no se transmite aunque se haya enviado en la solicitud original. Esta puede haber sido la causa original del problema.

Vuelva a verificar que el encabezado faltante no esté en el $ _SERVER superglobal. En general, no confiaría en apache_ * si realmente tuviera que hacerlo.

En una nota al margen, ¿X-Requested-With el estándar todavía? He leído sobre varias bibliotecas agregándolo, pero no sabía que se había convertido en el estándar todavía.

No puedo responder específicamente a este caso, pero en general recomendaría usar un parámetro (consulta) para señalar las solicitudes xmlhttp, en lugar de un encabezado. Nunca se sabe qué divertido servidor de seguridad o proxy podría tener que lidiar con los encabezados HTTP, o almacenar en caché una respuesta AJAX que debería haber sido una respuesta HTML simple del navegador (o viceversa).

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top