Sans solution côté serveur, il n'y a qu'un seul moyen pour qu'une page sécurisée puisse obtenir quelque chose d'une page/requête non sécurisée, et c'est par le biais de postMessage et d'une popup.
J'ai dit popup parce que le site n'est pas autorisé à mélanger le contenu. Mais une popup n'est pas vraiment un mélange. Elle a sa propre fenêtre mais elle est toujours capable de communiquer avec l'ouvreur avec postMessage.
Vous pouvez donc ouvrir une nouvelle page http avec window.open(...)
et que cela fasse la demande pour vous
XDomain m'est venu à l'esprit quand j'ai écrit ceci mais voici une approche moderne utilisant la nouvelle récupérer l'api l'avantage est le streaming de fichiers volumineux, l'inconvénient est qu'il ne fonctionne pas dans tous les navigateurs.
Vous mettez ce proxy script sur n'importe quelle page http
onmessage = evt => {
const port = evt.ports[0]
fetch(...evt.data).then(res => {
// the response is not clonable
// so we make a new plain object
const obj = {
bodyUsed: false,
headers: [...res.headers],
ok: res.ok,
redirected: res.redurected,
status: res.status,
statusText: res.statusText,
type: res.type,
url: res.url
}
port.postMessage(obj)
// Pipe the request to the port (MessageChannel)
const reader = res.body.getReader()
const pump = () => reader.read()
.then(({value, done}) => done
? port.postMessage(done)
: (port.postMessage(value), pump())
)
// start the pipe
pump()
})
}
Ensuite, vous ouvrez une fenêtre popup dans votre page https (notez que vous ne pouvez le faire que sur un événement d'interaction avec l'utilisateur, sinon il sera bloqué).
window.popup = window.open(http://.../proxy.html)
créer votre fonction utilitaire
function xfetch(...args) {
// tell the proxy to make the request
const ms = new MessageChannel
popup.postMessage(args, '*', [ms.port1])
// Resolves when the headers comes
return new Promise((rs, rj) => {
// First message will resolve the Response Object
ms.port2.onmessage = ({data}) => {
const stream = new ReadableStream({
start(controller) {
// Change the onmessage to pipe the remaning request
ms.port2.onmessage = evt => {
if (evt.data === true) // Done?
controller.close()
else // enqueue the buffer to the stream
controller.enqueue(evt.data)
}
}
})
// Construct a new response with the
// response headers and a stream
rs(new Response(stream, data))
}
})
}
Et faites la demande comme vous le faites normalement avec l'api fetch.
xfetch('http://httpbin.org/get')
.then(res => res.text())
.then(console.log)
0 votes
Ajax devrait fonctionner correctement sur https, pouvez-vous poster votre extrait de code actuel ?
2 votes
Cela ressemble à une SOP ( fr.wikipedia.org/wiki/Same_origin_policy ) : les schémas sont différents, il s'agit donc d'une origine différente.
0 votes
Merci pour la réponse. J'ai modifié mon site web en conséquence.