Как сделать запрос AJAX HTTPS GET с помощью jQuery

Как я могу явно сделать запрос AJAX HTTPS GET с помощью jQuery? Я пытаюсь сделать следующее. На странице https у меня есть строка с кодом $.get("/resource"), но я получаю следующую ошибку

XMLHttpRequest cannot load http://www.site.com/resource. No 'Access-Control-Allow-Origin' header is present on the requested resource. Origin 'https://www.site.com' is therefore not allowed access.

Почему вызов AJAX пытается получить доступ к странице с использованием протокола HTTP, если относительный ресурс находится на странице https? Если метод $.get(url) делает это по умолчанию, как мне использовать jQuery для выполнения явного HTTPS-запроса GET? Другой человек, у которого была аналогичная проблема, по адресу не может решить эту проблему.

Версия jQuery — 1.7.2.


person FearlessFuture    schedule 11.01.2014    source источник
comment
См.: stackoverflow.com/questions/15375908/   -  person klugerama    schedule 11.01.2014
comment
@FearlessFuture — Вы делаете GET из того же домена?   -  person Aneesh Vijendran    schedule 11.01.2014
comment
Также: stackoverflow.com/questions/7311702/   -  person klugerama    schedule 11.01.2014
comment
Почему бы просто не использовать абсолютный URL?   -  person klugerama    schedule 11.01.2014
comment
@avijendr, да, это из того же домена.   -  person FearlessFuture    schedule 11.01.2014


Ответы (4)


Я исправил проблему. Оказалось, что из-за того, как был настроен наш сайт Django, мне нужно было добавить завершающую косую черту к ресурсу в AJAX-запросе. Без завершающей косой черты Django будет перенаправлять на URL-адрес с завершающей косой чертой, используя HTTP-запрос вместо HTTPS-запроса.

Короче говоря, я заменил $.get("/resource") на $.get("/resource/").

Спасибо. Я очень ценю вашу помощь.

person FearlessFuture    schedule 17.01.2014
comment
Это было чрезвычайно полезно! Для всех, кто интересуется тем же, что и я - да, косая черта в конце не повлияет ни на какие параметры, т.е. /resource/?param=1 будет работать отлично. Еще одно замечание: это легче диагностировать на Chromium, так как Chromium показывает два запроса (один https, второй https), тогда как FireBug показывает только заголовок GET https://... вместе с заголовком location: http://..., что может сбивать с толку. - person Protagonist; 09.09.2014
comment
Это не похоже на общий ответ на эту проблему, но только для сред django с вашей секретной конфигурацией? Или добавление косой черты каким-то образом является секретной настройкой jquery для https. - person Andrew; 15.07.2016
comment
Смысл этого ответа в том, что если ваш URL-адрес немного неверен, ваш сервер, вероятно, автоматически перенаправляется ... поэтому дважды проверьте, какой URL-адрес вы на самом деле запрашиваете, и где вы в конечном итоге. - person Andrew; 15.07.2016
comment
Это решение сработало для меня с использованием Flask Blueprints. Перенаправление на URL-адрес с завершающим / было проблемой - person migreva; 28.09.2016
comment
ВТФ!!! Я потратил час на отладку этого bs. Почему в мире JQuery хочет использовать HTTP вместо HTTPS, если в конце URL-адреса отсутствует трейлинг /. Давай ВТФ! Вот правильный алгоритм: если в протоколе есть буква «S» (например, https://), используйте HTTPS, если в протоколе нет буквы «S» (например, http://), не используйте HTTPS. - person Gianluca Ghettini; 15.02.2019

Если страница, на которой вы находитесь, является страницей https, а страница, к которой пытается получить доступ .get, — это http, то это не будет работать из-за того же источника. Однако вы можете просто написать ajax вместо того, чтобы передавать его с помощью .get :)

$.ajax({
    type: "GET", 
    url: "https://someurl"
});

Хотя я полагаю, чтобы быть справедливым, это все еще не соответствует настоящему javascript

person mituw16    schedule 11.01.2014
comment
Ваш ответ не работает, если это другой домен! См. - stackoverflow.com/questions/15375908/ - person Aneesh Vijendran; 11.01.2014
comment
@avvijender, ну это само собой разумеющееся. OP не говорит, что они пытаются сделать междоменный запрос. - person mituw16; 11.01.2014
comment
Если это не междоменный запрос, он работает, и я думаю, что этого вопроса здесь не будет. Я использовал 100 https ajax get/post, но из того же домена! - person Aneesh Vijendran; 11.01.2014
comment
Как и я. Однако у меня много раз возникала проблема с https/http. Если запрос исходит от https, но пытается попасть по http в том же домене, я видел, как это происходило. Несправедливые минусы... - person mituw16; 11.01.2014
comment
Ну, я снова проголосовал. Я вообще не люблю голосовать против! Это просто вопрос разных мнений. - person Aneesh Vijendran; 11.01.2014
comment
@ mituw16, это проблема, с которой я столкнулся. Я на странице HTTPS и делаю запрос GET к ресурсу на том же сайте, но он пытается получить доступ к ресурсу на том же самом сайте, но с протоколом HTTP. - person FearlessFuture; 11.01.2014
comment
@FearlessFuture Вы можете либо попробовать то, что я ответил, либо передать абсолютный URL-адрес .get, как предложил klugerama. Либо должно работать - person mituw16; 11.01.2014
comment
@mituw16 mituw16, я получаю ту же ошибку, когда я устанавливаю URL-адрес на /resource и когда я устанавливаю URL-адрес на site.com/ ресурс. - person FearlessFuture; 11.01.2014
comment
Попробуйте написать ajax вместо использования .get - person mituw16; 11.01.2014
comment
@FearlessFuture — какой браузер и версию вы используете? Это происходит для всех браузеров? Если нет, попробуйте другие браузеры и сообщите нам. - person Aneesh Vijendran; 11.01.2014
comment
Это происходит в IE9: (точная версия неизвестна) IE10: 10.0.9200.16686 Chrome: 31.0.1650.63 - person FearlessFuture; 11.01.2014
comment
@mituw16, я использовал $.ajax() вместо $.get() в своем последнем комментарии к вам. - person FearlessFuture; 11.01.2014
comment
Не могли бы вы опубликовать свой код? Дал бы нам лучшее представление о том, что происходит - person mituw16; 11.01.2014
comment
К сожалению, больше строки, указанной в посте, выложить не могу, т.к. это фирменный софт. - person FearlessFuture; 11.01.2014

Попробуйте установить тип данных «jsonp», это помогло мне в прошлом с запросами из разных источников.

    $.ajax({
            url: "//www.site.com/resource"
            dataType: "jsonp",
            success: function(data) {
                $(".demo-card").html(data);
            }
    });
person alphapilgrim    schedule 18.08.2015
comment
dataType предназначен для определения формата данных ответа, он не имеет ничего общего с запросом. Вы ищете crossDomain. - person jurchiks; 11.05.2016

Просто используйте RewriteRule в вашем файле .htaccess с указанным протоколом, например:

RewriteCond %{REQUEST_URI} .+[^/]$
RewriteRule ^(.*)$ https://%{SERVER_NAME}%{REQUEST_URI} [R=301,L,QSA]
person Alex S    schedule 29.05.2017