2009-07-09 2 views
96

Мой сайт использует протокол http и https; это не влияет на контент. Мой сайт использует jQuery ajax calls, который заполняет некоторые области на странице.Ajax с использованием https на странице http

Теперь я хотел бы сделать все ajax-вызовы по https. (пожалуйста, не спрашивайте меня, почему :)) Когда я нахожусь на странице с протоколом https, запросы ajax работают. Когда я на странице с протоколом HTTP, я получаю яваскрипт ошибки: Доступа к ограниченной URI отказано

Я знаю, что это проблема кросса домена (на самом деле, это проблема кросса протокола), и я знаю, что я должен использовать тот же протокол в вызовах ajax, что и на текущей странице.

Тем не менее, я хочу, чтобы все вызовы ajax были https и вызывали их на странице, которая была передана через http. Есть ли какое-либо обходное решение для достижения этого (какое-то решение json/proxy?), Или это просто невозможно?

+4

Почему бы не совместить ajax с протоколом загрузки страницы? – scheibk

+41

Они специально сказали: «Пожалуйста, не спрашивайте меня, почему». –

+0

Зачем вам нужен AJAX с HTTPS, хотя ..... – Miles

ответ

2

Вы можете попытаться загрузить страницу https в iframe и маршрутизировать все запросы ajax в/из фрейма через какой-либо мост, это хаккаунд, но он может работать (не уверен, что он наложит те же ограничения доступа безопасный контекст). В противном случае местным HTTP-прокси-сервером для перенаправления запросов (например, любых перекрестных доменных вызовов) будет принятое решение.

+2

После прочтения этой темы я придерживался JSONP http://www.dslreports.com/forum/r21425467-IFrame-With-HTTPS-on-HTTP-Page – JGFMK

+0

Это можно сделать, но не забудьте установить заголовки P3P, если вам нужны сеансовые куки из iFrame ... иначе MSE скажет «nu uh uh» – srquinn

8

http://example.com/ может разрешить другой виртуальный хост, чем https://example.com/ (который, поскольку заголовок хоста не отправляется, отвечает на значение по умолчанию для этого IP-адреса), поэтому они рассматриваются как отдельные домены и, таким образом, подвержены ограничениям JS Crossdomain.

JSON callbacks может позволить вам избежать этого.

11

Попробуйте JSONP.

Большинство JS-библиотек делают это так же просто, как и другие вызовы AJAX, но внутренне используют iframe для выполнения запроса.

Если вы не используете JSON для своей полезной нагрузки, вам придется свернуть собственный механизм вокруг iframe.

лично, я бы просто перенаправить сформировать HTTP: // Страница с https: // один

+1

hmm Я попробовал jquery .ajax с jsonp: 'jsonp_callback', но все же такая же ошибка js. – user135863

+0

Возможно, вам нужно добавить параметр обратного вызова в URL-адрес – Javier

+0

@ user135863 Означает ли конечная точка, по которой вы отправляете запрос * * * * JSONP? –

4

Заканчивать проект с открытым исходным кодом Forge. Он обеспечивает выполнение JavaScript TLS, наряду с некоторыми флэш для обработки фактических кросс-доменных запросов:

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

Короче говоря, Forge позволит вам сделать XMLHttpRequests с веб-страницы, загруженной через HTTP с сайта HTTPS , Для включения междоменных запросов вам необходимо предоставить файл политики междоменной политики Flash через ваш сервер. Просмотрите сообщения в блоге в конце README, чтобы получить более подробное объяснение того, как это работает.

Однако я должен упомянуть, что Forge лучше подходит для запросов между двумя разными https-доменами. Причина в том, что существует потенциальная атака MiTM. Если вы загружаете JavaScript и Flash с незащищенного сайта, это может быть скомпрометировано. Наиболее безопасное использование - загрузить его с защищенного сайта, а затем использовать его для доступа к другим сайтам (безопасным или иным образом).

56

Добавить заголовок-Allow-Origin Access-Control с сервера

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

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

+7

Отличный ответ - но не поддерживается некоторыми используемыми браузерами, такими как Opera (совсем нет) и Internet Explorer (поддерживается начиная с версии 8) http://caniuse.com/#search=cors – SimonSimCity

+1

Кажется, что Opera поддерживает его сейчас: http://en.wikipedia.org/wiki/Cross-Origin_Resource_Sharing#Browser_support Только не Opera Mini, хотя ... – rednaw

2

Вот что я делаю:

Сформировать скрытый IFrame с данными, вы хотели бы опубликовать , Поскольку вы все еще контролируете iFrame, то такое же происхождение не применяется. Затем отправьте форму в iFrame на страницу ssl. Затем ssl-страница перенаправляется на страницу, отличную от ssl, с сообщениями о состоянии. У вас есть доступ к iFrame.

+0

Это можно сделать, но не забудьте установить заголовки P3P, если вам нужны сеансовые куки из iFrame ... иначе MSE скажет «nu uh uh», – srquinn

Смежные вопросы