Ajax за допомогою https на сторінці http


101

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

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

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

Проте я хочу, щоб усі дзвінки ajax були https, і називати їх на сторінці, яка надсилалася через http. Чи є якесь вирішення для досягнення цього (якесь рішення json / proxy?), Чи це просто неможливо?


4
Чому б не узгодити ajax з протоколом завантаження сторінки?
scheibk

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

можливо, вам доведеться додати параметр зворотного виклику в URL
Javier

@ user135863 Чи відповідає кінцевій точці, на яку ви надсилаєте запит на підтримку JSONP?
Лі Бренецький

1
Заради своєї розумності я збираюся піти з вашим останнім варіантом ... Просте перенаправлення наhttps:
Dzeimsas Zvirblis

9

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

Зворотні виклики JSON можуть уникнути цього.


мертве посилання на зворотні дзвінки JSON :(
Kubie

@Kubie Цій відповіді завтра виповниться десять років, і тому ми пориваємо пошкоджені посилання.
цеяйоз

щойно помітив 10 років га ... і так хороший момент. Добре, я погукаю за цим і редагую відповідь, якщо я щось знайду
Кубі

4

Ознайомтеся з проектом Forge з відкритим джерелом Він забезпечує реалізацію JavaScript TLS разом із деякими Flash для обробки фактичних запитів між доменними:

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

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

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


2

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


2
Прочитавши цю тему, я б дотримувався JSONP dslreports.com/forum/r21425467-IFrame-With-HTTPS-on-HTTP-Page
JGFMK

Це можна зробити, але не забудьте встановити заголовки P3P, якщо вам потрібні файли cookie сеансу з iFrame ... інакше MSE скаже "nu uh uh"
srquinn

2

Ось що я роблю:

Створіть прихований iFrame з даними, які ви хочете опублікувати. Оскільки ви все ще керуєте цим iFrame, те саме походження не застосовується. Потім надішліть форму в цьому iFrame на сторінку ssl. Потім сторінку ssl переспрямовує на сторінку, яка не є ssl, із повідомленнями про стан. У вас є доступ до iFrame.


Це можна зробити, але не забудьте встановити заголовки P3P, якщо вам потрібні файли cookie сеансу з iFrame ... інакше MSE скаже "nu uh uh"
srquinn
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.