Introducción a AJAX

11.4. Evitar el problema de los dominios diferentes

Como ya se ha explicado y se ha podido comprobar en algunos de los ejercicios, los navegadores imponen restricciones muy severas a las conexiones de red que se pueden realizar mediante AJAX. Esta característica se conoce como "el problema de los dominios diferentes" (en inglés, "cross-domain problem").

El código JavaScript alojado en un servidor, no puede realizar conexiones con otros dominios externos. También existen problemas entre subdominios de un mismo sitio web, que se pueden evitar con el uso de la propiedad document.domain.

Afortunadamente, existen opciones para poder realizar conexiones con cualquier dominio externo al servidor que aloja el código JavaScript. Todas las soluciones que son viables técnicamente y que funcionan de la misma forma en cualquier navegador hacen uso de recursos en el servidor que aloja el código JavaScript original.

La solución más sencilla es la de habilitar el módulo mod_rewrite en los servidores web de tipo Apache. Con este módulo activado, Apache se puede convertir en un proxy transparente que realice las peticiones externas en nombre del script y le devuelva los resultados.

En el siguiente ejemplo, el navegador descarga el script desde el servidor1. Por este motivo, el código del script puede solicitar recursos del servidor1, pero no puede establecer conexiones con el servidor2:

El script descargado desde el servidor1 no puede establecer conexiones de red con el servidor2

Figura 11.1 El script descargado desde el servidor1 no puede establecer conexiones de red con el servidor2

La solución más sencilla para resolver este problema consiste en configurar el servidor web del servidor1. Si se utiliza el servidor web Apache, para configurar el proxy transparente, se habilita el módulo mod_rewrite y se añaden las siguientes directivas a la configuración de Apache:

RewriteEngine on
RewriteRule ^/ruta/al/recurso$ http://www.servidor2.com/ruta/al/recurso [P]

Ahora, el código de la aplicación puede acceder a cualquier recurso del servidor2 ya que:

  • El script realiza peticiones a: http://www.servidor1.com/ruta/al/recurso
  • En el servidor1 se transforma automáticamente a: http://www.servidor2.com/ruta/al/recurso
  • El servidor1 obtiene la respuesta del servidor2 y la envía de nuevo al script
Utilizando un proxy transparente, los scripts pueden acceder a los recursos que se encuentren en cualquier servidor

Figura 11.2 Utilizando un proxy transparente, los scripts pueden acceder a los recursos que se encuentren en cualquier servidor

Además de utilizar el servidor web como proxy transparente, también es posible diseñar un proxy a medida mediante software. Yahoo por ejemplo ofrece una extensa documentación para los desarrolladores de aplicaciones web. Entre esta documentación, se encuentra un artículo sobre el uso de proxys para evitar el problema de las peticiones externas de AJAX: http://developer.yahoo.com/javascript/howto-proxy.html

Además, Yahoo ofrece un proxy de ejemplo realizado con PHP y que puede ser utilizado para conectar aplicaciones JavaScript con sus servicios web.