Ajax с использованием https на странице http

101

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

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

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

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

пользователь135863
источник
4
Почему бы не сопоставить ajax с протоколом загрузки страницы?
scheibk 09
45
Они специально сказали: «Пожалуйста, не спрашивайте меня, почему».
Крис Москини,
Зачем вам нужен AJAX с HTTPS ...
Майлз,
4
Например, для более динамичной формы оформления заказа, которая подключается к платежному шлюзу, такому как PayPal, в фоновом режиме, чтобы люди могли видеть, что происходит .. Еще одна возможность
Кентор

Ответы:

58

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

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

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

ДальСофт
источник
7
Отличный ответ, но не поддерживается некоторыми используемыми браузерами, такими как Opera (совсем не) и Internet Explorer (поддерживается с версии 8) caniuse.com/#search=cors
SimonSimCity
1
Похоже, Opera теперь его поддерживает: en.wikipedia.org/wiki/… Только не Opera Mini…
gitaarik
11

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

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

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

лично я бы просто перенаправил страницу http: // на страницу https: //

Хавьер
источник
1
хм, я пробовал jquery .ajax с установленной опцией jsonp: 'jsonp_callback', но все еще та же ошибка js.
user135863 09
возможно, вам нужно добавить параметр обратного вызова в URL-адрес
Хавьер
@ user135863 ли конечная точка вы отправляете запрос на поддержку JSONP в первую очередь?
Leigh Brenecki 02
1
Ради здравого смысла я https:
выберу
9

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

Обратные вызовы JSON могут позволить вам избежать этого.

Ceejayoz
источник
мертвая ссылка на обратные вызовы JSON :(
Куби 08
@Kubie Этому ответу завтра исполняется десять лет, и именно поэтому мы просим неработающих ссылок включать в вопросы достаточно информации, чтобы выдержать их.
ceejayoz 09
только что заметил 10 лет га ... и да хороший момент. Ничего страшного, найду это в Google и отредактирую ответ, если найду что-нибудь
Куби
4

Ознакомьтесь с проектом Forge с открытым исходным кодом. Он предоставляет реализацию TLS JavaScript, а также немного Flash для обработки фактических междоменных запросов:

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

Короче говоря, Forge позволит вам создавать запросы XmlHttpRequests с веб-страницы, загруженной через http, на сайт https. Вам нужно будет предоставить файл междоменной политики Flash через свой сервер, чтобы разрешить междоменные запросы. Просмотрите сообщения в блоге в конце README, чтобы получить более подробное объяснение того, как это работает.

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

dlongley
источник
2

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

Квинтин Робинсон
источник
2
Прочитав эту ветку
JGFMK
Это можно сделать, но не забудьте установить заголовки P3P, если вам нужны файлы cookie сеансов из iFrame ... в противном случае MSE скажет «ну эээ»
srquinn
2

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

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

kjv
источник
Это можно сделать, но не забудьте установить заголовки P3P, если вам нужны файлы cookie сеансов из iFrame ... в противном случае MSE скажет «ну эээ»
srquinn