2009-07-09 25 views
96

Mi sitio usa protocolos http y https; no afecta el contenido. Mi sitio utiliza jQuery ajax calls, que también llena algunas áreas de la página.Ajax usando https en una página http

Ahora, me gustaría hacer todas las llamadas ajax a través de https. (por favor, no me preguntes por qué :)) Cuando estoy en una página con protocolo https, las solicitudes ajax están funcionando. Cuando estoy en una página con protocolo http, me sale un error de javascript: Acceso a URI restringido negó

Sé que este es un problema entre dominios (de hecho, es un problema de protocolo de cruz), y yo Sé que debería usar el mismo protocolo en llamadas ajax que en la página actual.

Aún así, quiero que todas las llamadas ajax sean https, y las llamo en una página que se sirvió en http. ¿Hay alguna solución para lograr esto (alguna solución json/proxy?), ¿O simplemente es imposible?

+4

¿Por qué no coincide el ajax con el protocolo de página de carga? – scheibk

+41

Ellos dijeron específicamente "Por favor, no me pregunten por qué". –

+0

Por qué necesita AJAX con HTTPS aunque ... – Miles

Respuesta

2

Puede intentar cargar la página https en un iframe y enrutar todas las solicitudes ajax dentro/fuera del marco a través de algún puente, es un hackaround pero podría funcionar (no estoy seguro si impondrá las mismas restricciones de acceso). el contexto seguro). De lo contrario, un proxy http local para redirigir las solicitudes (como cualquier llamada de dominio cruzado) sería la solución aceptada.

+2

Después de leer este hilo, me quedaría con JSONP http://www.dslreports.com/forum/r21425467-IFrame-With-HTTPS-on-HTTP-Page – JGFMK

+0

Esto se puede hacer, pero asegúrese de configurar los encabezados P3P si necesitas sesiones de cookies del iFrame ... de lo contrario, MSE dirá "nu uh uh" – srquinn

8

http://example.com/ puede resolverse en un VirtualHost diferente de https://example.com/ (que, como el encabezado del host no se envía, responde al valor predeterminado para esa IP), por lo que los dos se tratan como dominios separados y por lo tanto están sujetos a las restricciones de dominio cruzado JS.

JSON callbacks puede permitirte evitar esto.

11

Prueba JSONP.

la mayoría de las bibliotecas JS lo hacen tan fácil como otras llamadas AJAX, pero internamente utilizan un iframe para realizar la consulta.

si no está utilizando JSON para su carga útil, entonces tendrá que implementar su propio mecanismo alrededor del iframe.

personalmente, me gustaría simplemente redirigir forman el http: // página a los https: // uno

+1

hmm He intentado jquery .ajax con la opción jsonp: 'jsonp_callback', pero igual error de js. – user135863

+0

tal vez tenga que agregar el parámetro de devolución de llamada en la URL – Javier

+0

@ user135863 ¿El extremo al que está enviando la consulta * admite * JSONP en primer lugar? –

4

Comprobar a cabo el proyecto de código abierto Forge. Proporciona una implementación de JavaScript TLS, junto con algo de flash para manejar las peticiones reales de varios dominios:

http://github.com/digitalbazaar/forge/blob/master/README

En resumen, Forge le permitirá hacer XmlHttpRequests desde una página web cargado a través de HTTP a un sitio HTTPS . Tendrá que proporcionar un archivo de política de Flash entre dominios a través de su servidor para habilitar las solicitudes entre dominios. Consulte las publicaciones del blog al final de README para obtener una explicación más detallada de cómo funciona.

Sin embargo, debo mencionar que Forge es más adecuado para solicitudes entre dos dominios https diferentes. La razón es que hay un posible ataque MiTM. Si carga JavaScript y Flash desde un sitio no seguro, podría verse comprometido. El uso más seguro es cargarlo desde un sitio seguro y luego usarlo para acceder a otros sitios (seguro o no).

56

Añadir la cabecera-Allow-Origen Access-Control del servidor

Access-Control-Allow-Origin: https://www.mysite.com 

http://en.wikipedia.org/wiki/Cross-Origin_Resource_Sharing

+7

Respuesta excelente - pero no compatible con algunos navegadores usados ​​como Opera (nada) e Internet Explorer (compatible desde la versión 8) http://caniuse.com/#search=cors – SimonSimCity

+1

Parece que Opera lo admite ahora: http://en.wikipedia.org/wiki/Cross-Origin_Resource_Sharing#Browser_support Solo que no es Opera Mini aunque ... – rednaw

2

Esto es lo que hago:

generar un iframe oculto con los datos que desea publicar . Como todavía controlas ese iFrame, el mismo origen no se aplica. A continuación, envíe el formulario en ese iFrame a la página ssl. La página ssl luego redirige a una página que no es ssl con mensajes de estado. Usted tiene acceso al iFrame.

+0

Esto se puede hacer, pero asegúrese de establecer encabezados P3P si necesita cookies de sesiones del iFrame ... de lo contrario, MSE dirá "nu uh uh" – srquinn

Cuestiones relacionadas