Ajax usando https en una página http


101

Mi sitio utiliza el protocolo http y https; no afecta el contenido. Mi sitio usa llamadas jQuery ajax, que también llena algunas áreas de la página.

Ahora, me gustaría hacer todas las llamadas ajax a través de https. (por favor, no me pregunte por qué :)) Cuando estoy en una página con protocolo https, las solicitudes ajax funcionan. Cuando estoy en una página con protocolo http, aparece un error de javascript: acceso a URI restringido denegado

Sé que este es un problema de dominio cruzado (de hecho, es un problema de protocolo cruzado), y sé que debería usar el mismo protocolo en las llamadas ajax que en la página actual.

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


4
¿Por qué no hacer coincidir el ajax con el protocolo de página de carga?
Scheibk

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

Sin embargo, ¿por qué necesita AJAX con HTTPS ...?
Miles

4
Por ejemplo, para un formulario de pago más dinámico que se conecta a una pasarela de pago como PayPal en segundo plano para que la gente pueda ver lo que está sucediendo. Solo una de más posibilidades
kentor

Respuestas:


58

Agregue el encabezado Access-Control-Allow-Origin desde el servidor

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

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


7
Excelente respuesta, pero no es compatible con algunos navegadores usados ​​como Opera (para nada) e Internet Explorer (compatible desde la versión 8) caniuse.com/#search=cors
SimonSimCity

1
Parece que Opera lo admite ahora: en.wikipedia.org/wiki/ ... Aunque no Opera Mini ...
gitaarik

11

Prueba JSONP.

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

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

personalmente, simplemente redirigiría de la página http: // a la https: //


1
hmm, he probado jquery .ajax con jsonp: conjunto de opciones 'jsonp_callback', pero sigue siendo el mismo error de js.
user135863

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

@ user135863 ¿El punto final al que está enviando la consulta es compatible con JSONP en primer lugar?
Leigh Brenecki

1
Por el bien de mi cordura, voy a ir con su última opción ... Redirección simple ahttps:
Dzeimsas Zvirblis

9

http://example.com/ puede resolverse en un VirtualHost diferente a 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 separados dominios y, por lo tanto, sujetos a restricciones JS de dominios cruzados.

Las devoluciones de llamada JSON pueden permitirle evitar esto.


enlace muerto en devoluciones de llamada JSON :(
Kubie

@Kubie Esta respuesta tiene diez años mañana y los enlaces rotos son la razón por la que pedimos que las preguntas incluyan suficiente información para sobrevivir a una.
ceejayoz

acabo de notar los 10 años ha ... y sí buen punto. Está bien, buscaré en Google para esta y editaré la respuesta si encuentro algo
Kubie

4

Echa un vistazo al proyecto Forge de código abierto. Proporciona una implementación TLS de JavaScript, junto con algo de Flash para manejar las solicitudes reales entre dominios:

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

En resumen, Forge le permitirá realizar XmlHttpRequests desde una página web cargada a través de http a un sitio https. Deberá proporcionar un archivo de política Flash entre dominios a través de su servidor para habilitar las solicitudes entre dominios. Consulte las publicaciones del blog al final del 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 existe 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 (seguros o no).


2

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


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

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

2

Esto es lo que hago:

Genere un iFrame oculto con los datos que le gustaría publicar. Dado que todavía controlas ese iFrame, no se aplica el mismo origen. Luego 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. Tienes acceso al iFrame.


Esto se puede hacer, pero asegúrese de configurar los encabezados P3P si necesita cookies de sesión del iFrame ... de lo contrario, MSE dirá "nu uh uh"
srquinn
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.