Hace pocos días realizando un proyecto en PHPy Ajax utilizando jQuery – para mi personalmente la mejor herramienta ajax que existe, respetando las demás-, me topé con un caso muy curioso mientras realizaba pruebas con IE8 particularmente. Los llamados http post y get simplemente no funcionaban al momento de pasar variables a session, a cookies o simplemente de response. En resumen, no funcionaba.
Conversando con José Diaz, un colega de trabajo, excelente programador por demás, intercambiamos ideas de las posibles causas del mismo según la experiencia de ambos en casos como estos y enumerábamos algunas circunstancias en las que este tipo de incompatibilidades de IE con Ajax suelen producirse. En este caso en particular era el paso de variables de session creadas mediante el jquery post o get con la función $.ajax y retornarlas para su consumo luego del response o respuesta del llamado.
Iniciamos, planteando las posibles causas de la ausencia de las variables de session luego de ser registradas y en donde las mismas simplemente desaparecían por si solas. Luego, enumeramos las diferentes formas de corregir esta incompatibilidad según algunos casos anteriores, y estas son las tres principales que logramos resaltar y que para la mayoría de los casos funciona:
1. Declarando el protocolo P3P (Plataforma de Preferencias de Privacidad)
Mediante la declaración en cabecera con php header() de los parámetros de este protocolo para protección de información personal del navegador y permitir lel paso de session y cookies por todo nuestro sitio web indicando al navegador que el paso de estas informacion es completamente seguro dentro de nuestro sitio.
<?php header(‘P3P: CP=”CURa ADMa DEVa PSAo PSDo OUR BUS UNI PUR INT DEM STA PRE COM NAV OTC NOI DSP COR”‘); ?>
Esto también puede realizarse mediante la< meta> de nuestro fichero o archivo:
<meta http-equiv=”P3P” content=’CP=”CURa ADMa DEVa PSAo PSDo OUR BUS UNI PUR INT DEM STA PRE COM NAV OTC NOI DSP COR”‘>
2. Asignando un setTimeout()
Al momento de realizar una llamado $.ajax mediante POST o GET, las sesiones no tiene una fecha de exploración asignada por lo que le navegador no identifica el tiempo de vida de la session y por ende reinicia la misma tantas veces se ejecuta el session_start(). para evitarlo, simplemente basta con pasar un parámetro o valor adicional al momento del llamado del $.ajax o $.POST o bien $.GET, al cual podemos llamar de cualquier nombre pero siempre pasando el valor setTimeout();
De esta manera le indicamos al navegador que cada llamada a la declaración de session es distinta y por ende mantenga sus valores, salvo se indique lo contrario, es decir, un cambio de valor de la variable o un unset() o bien un session_destroy.
3. Creando una función en javascript para la lectura de las variables de session
Esto no es mas que creando una función en javascript para que los parámetros de nuestra session que queremos declarar o consultar para crear una cookie con los valores de nuestra session y que los mismo puedan ser consultado a través de esta función por vía la nueva cookie creada. Esta solución es las mas tediosa, ya que hay que crear una función solo para ese fin lo que no lleva a que una buena aplicación es la que puede funcionar y realizar su objetivo con menor cantidad de código posible (Optimizada) o “Robusta” como le dice mi colega.
Sin embargo, luego de haber probado estas soluciones, probadas y con los resultados esperados en otros casos, mas no fue así en este caso. Lo que nos llama a la incógnita y curiosidad del por qué aun no funcionaba el llamado $.ajax cuando en casos anterior si había logrado el objetivo con algún de estas soluciones.
LA SOLUCION
Luego de consultar en google casos similares de programadores a los que les ha ocurrido esto nos dimos cuenta que en todos los casos las posibles soluciones eran las mismas que nosotros habíamos utilizado en este y otros casos. Como no lograba que funcionara dediqué unos minutos de cada día para atacar este caso sin descuidar mi día a día; pero con la curiosidad de saber el por qué? de este caso en particular.
Luego de varios dias y de haber probado una decena de opciones desde la configuración del servidor, configuran de HTTP service (Apache), configuraciones de PHP, incluso modificaciones en la librería jQuery noté que en este caso particular existían algunas diferencias en cuanto a la plataforma que en casos anteriores. Y es que:
1. La plataforma de desarrollo esta montada sobre Virtual Host, ya que suelo trabajar varios proyectos a la misma vez.
2. La plataforma estaba basada en WAMP, cuando por lo regular y a preferencia personal utilizo AppServ.
3. El host de referencia del proyecto en particular contenía un carácter que casi no utilizo. El underscore [_] era parte del hostname utilizado para el proyecto.
Al final, luego en indagar en las características de IE para desarrollo de aplicaciones, encontré una nota en el sitio de desarrolladores de Microsoft en donde resaltaban que IE rechaza tajante y unilateralmente cualquier traspaso de variables de sessiones o cookies mediante Iframe. y como las consultas httpRequest de Ajax y particularmente jQuery realizan los llamados http POST y GET mediante un iframe oculto, esto causa la incompatibilidad con IE.
En resumen, si tiene este mismo problema y le has buscado la vuelta mediante los diferentes métodos mencionados anteriormente y aun no funciona.
NO utilices el caracter [_] “underscore” en el nombre de tu vhost: por ejemplo sitioweb_v2 o sitioweb_v3, etc. Trata de mantenerlo simple sitioweb2, sitiowebv2 o como quieras, simplemente no incluyas el caracter [_] en la declaración del host en tu entorno de desarrollo.
Plataforma de Preferencias de Privacidad