2008-09-09 13 views
20

Mientras que las secuencias de comandos entre sitios se consideran generalmente negativas, me he encontrado con varias situaciones en las que es necesario.Mejor práctica: Secuencias de comandos cruzadas legítimas

Hace poco estuve trabajando dentro de los límites de un sistema de gestión de contenido muy limitado. Necesitaba incluir el código de la base de datos dentro de la página, pero el servidor de alojamiento no tenía disponible nada utilizable. Configuré un par de scripts básicos en mi propio servidor, pensando originalmente que podía usar AJAX para importar los contenidos de mis scripts directamente en la plantilla del CMS (conservando así imágenes dinámicas, elementos de menú, CSS, etc.). Estaba equivocado.

Debido a las limitaciones de los objetos XMLHttpRequest, no es posible extraer contenido de un dominio diferente. Así que pensé iFrame - aunque no soy fanático de los marcos, pensé que podría crear un marco que coincidiera con el ancho y alto del contenido, para que pareciera nativo. Una vez más, me bloquearon las "protecciones" de scripts entre sitios. Si bien podría cargar un archivo remoto en el iFrame, no podría ejecutar JavaScript para modificar su tamaño en la página del host o en la página cargada.

En este caso particular, no pude apuntar un subdominio a mi servidor. Tampoco pude crear una secuencia de comandos en el servidor CMS que pudiera proxy de contenido de mi servidor, por lo que mi último pensamiento fue utilizar un JavaScript remoto.

Un JavaScript remoto funciona. Se rompe cuando el usuario tiene JavaScript desactivado, lo cual es un inconveniente; pero funciona. El "problema" que tenía con el uso de JavaScript remoto era que tenía que usar la función JS document.write() para generar cualquier contenido. Cualquier salida que no sea JS causa errores de script. Además de usar document.write() para cada línea, también debe asegurarse de que se escape el contenido, o de lo contrario terminará con más errores de secuencia de comandos.

Mi solución fue la siguiente:

Mi script recibió un parámetro GET ("página") y luego buscó el archivo ({$page}.php), y leer el contenido en una variable. Sin embargo, tuve que usar técnicas de búfer incómodas para ejecutar realmente los scripts incluidos (para cosas como la interacción con la base de datos) y luego quitar el contenido final de todos los caracteres de salto de línea (\n) y luego escapé todos los caracteres requeridos. El resultado final es que mi script original (que emite JavaScript) accede a scripts aparentemente "estándar" en mi servidor y convierte su salida estándar a JavaScript para mostrar dentro de la plantilla de CMS.

Si bien esta solución funciona, parece que puede haber una forma mejor de lograr lo mismo. ¿Cuál es la mejor manera de hacer que las secuencias de comandos entre sitios específicamente trabajen con el propósito de incluir contenido de un dominio completamente diferente?

Respuesta

14

Tienes tres opciones:

  1. Crear una server side proxy script.
  2. Cree una secuencia de comandos remota para leer en HTML dinámico remoto. Use una biblioteca como jQuery para hacer esto más fácil. Puede usar el load function para inyectar HTML donde sea necesario. EDIT Lo que originalmente quise decir, por ejemplo, # 2 estaba utilizando JSONP, que requiere que el script del lado del servidor reconozca la "devolución de llamada =?" param.

  3. Utilice un client side Flash proxy y configure un archivo crossdomain.xml en la raíz web de su servidor.

+0

Ruego que se aclare # 2? Para el tipo de datos 'html', como en load(), jQuery usa XMLHttpRequest, que no funciona en sitios cruzados. Además, load() quita las etiquetas de script. –

+0

Lo siento, lo que quise decir con # 2 es usar JSONP http://docs.jquery.com/Release:jQuery_1.2/Ajax#Cross-Domain_getJSON_.28using_JSONP.29 –

1

Personalmente, me gustaría llamar a ese otro dominio en el servidor y obtener y analizar los datos allí para su uso en su página. De esta forma evitará cualquier problema y obtendrá el poder de un lenguaje/plataforma del lado del servidor para obtener y analizar los datos.

No estoy seguro si eso funcionaría para su escenario específico ... difícil saber incluso con su descripción detallada ...

0

Me he encontrado con YDN server side proxy script antes. Dice que está diseñado para funcionar con las API de búsqueda de Yahoo.

¿Funcionará con cualquier dominio, si simplemente recorta el código API de Yahoo? ¿O necesita reemplazarlo con el dominio con el que desea que funcione?

1

Puede probar easyXDM, incluyendo muy poco código, puede pasar llamadas de datos o métodos entre documentos de diferentes dominios.

0

El contenido remoto de iframe puede ser accedido por javascript local.

El servidor remoto solo tiene que configurar el document.domain de la página.

Ej:

sitio contiene un iframe con src='Site B/home.php'

home.php se parece a esto:

[php stuff]...[/php] 
[script type='text/javascript']document.domain='Site A'[/script] 
Cuestiones relacionadas