2008-10-30 11 views
5

He escrito una aplicación web en PHP que hace uso de las solicitudes Ajax (realizadas mediante YUI.util.Connect.asyncRequest).PHP apache_request_headers() grados con realidad (según lo confirmado por Firebug): ¿por qué?

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

Pero no siempre. De forma intermitente, aparece una situación en la que se envía la solicitud Ajax (y Firebug confirma que los encabezados de la solicitud incluyen X-Requerido-Con de XMLHttpRequest) pero apache_request_headers() no está devolviendo ese encabezado en su lista.

La salida de cuando var_dump los apache_request_headers() es la siguiente (tenga en cuenta 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 

Este desajuste es (aparentemente) intermitente cuando ejecuto el mismo código. ¡Pero no creo en "intermitente" cuando se trata de software! ¡Ayuda!

Respuesta

7

no estoy seguro de por qué los apache_request_headers() y no coincidente Firebug, pero con el fin de leer los encabezados de solicitud se puede utilizar el $ _SERVER súper mundial

cada cabecera que está siendo enviado por un cliente (y que doesn no importa cómo es el cliente) llegará a la matriz de $ SERVER. La clave de esa cabecera estará con HTTP prefijo, todo el capital de las letras y el guión se convierte en el guión bajo (_)

en su caso, usted puede encontrar su valor necesario en:

$ _SERVER [ 'HTTP_X_REQUESTED_WITH' ] = 'XMLHttpRequest'

0

Comprueba que el encabezado que falta no está en el superglobal $_SERVER. En general, no confiaría en apache_ * si realmente tuviera que hacerlo.

En una nota de lado, ¿está X-Solicitado-Con el estándar todavía? He leído sobre varias bibliotecas que lo agregan, pero no sabía que se convirtió en el estándar todavía.

0

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

1

Para referencia futura de aquellos que se encuentran con esta pregunta, el "intermitente" puede deberse a una redirección que ocurre en el lado del servidor. Si se produce una redirección 302, el encabezado X-Requerido-No se transfiere aunque se haya enviado en la solicitud original. Esta pudo haber sido la causa original del problema.

Cuestiones relacionadas