PHP apache_request_headers () no está de acuerdo con la realidad (como lo confirma Firebug): ¿por qué?
-
05-07-2019 - |
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!
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).