Вызов AJAX завершается сбоем из-за ошибок HTTP / HTTPS смешанного содержимого, не может принудительно использовать HTTPS

У меня есть один экземпляр EC2, работающий за ELB, для которого я использовал AWS Certificate Manager (ACM), чтобы включить HTTPS.

Как было предложено в нескольких местах, я сопоставил HTTP (порт 80) и HTTPS (443) с HTTP (порт 80) моего экземпляра.

Я также включил принудительное безопасное соединение, добавив эти строки в файл .htaccess:

RewriteEngine On
RewriteCond %{HTTPS} !=on
RewriteCond %{HTTP:X-Forwarded-Proto} ^http$
RewriteRule .* https://%{HTTP_HOST}%{REQUEST_URI} [R=301,L]

Все это прекрасно работает. На всех страницах отображается безопасное содержимое, как и ожидалось, без предупреждений в консоли о смешанном содержимом.

Только на страницах, где я выполняю вызов AJAX, я получаю сообщение об ошибке смешанного содержимого и только в Chrome. FireFox работает должным образом, но консоль по-прежнему показывает ошибку.

Ошибка (FireFox):

Политика безопасности контента: обновление небезопасного запроса 'http://example.com/myapi/get_company/?code=abcd&limit=8 'использовать' https '

Ошибка (Chrome):

Смешанное содержание: страница "https://example.com/mypage" была загружена по HTTPS, но запросила небезопасная конечная точка XMLHttpRequest 'http://example.com/myapi/get_company/?code=abcd&limit=8 '. Этот запрос заблокирован; контент должен обслуживаться по HTTPS.

Я открыл chrome://net-internals/ и из того, что я вижу, есть два вызова: первый получает HTTP 301 Permanent Redirect, а второй не работает, потому что перенаправление указывает на страницу HTTP, а не HTTPS.

Вызов AJAX выглядит так:

$url = "/myapi/get_company?code=" + e;
apiJson = $.ajax({
    url: $url, 
    dataType: 'json',
    data:{
        limit:8
    },
success: function(data) { //Some code here },
error: function(jqXHR, textStatus, errorThrown) { //Some code here }
});

Я также попытался указать полный URL-адрес, включая протокол, но это не имело значения.


person Insider Pro    schedule 19.05.2016    source источник
comment
Зачем нужно условие RewriteCond% {HTTPS}! = On?   -  person Shibashis    schedule 19.05.2016


Ответы (3)


Обновите конфигурацию .htaccess

RewriteCond %{HTTPS} !=on -> Не нужен

обновите конфигурацию файла .htaccess до

RewriteCond %{HTTP:X-Forwarded-Proto} !https RewriteRule ^ https://%{HTTP_HOST}%{REQUEST_URI} [L,R=301,NE]

Помимо изменения файла .htaccess, вам также необходимо убедиться, что после загрузки страницы с использованием схемы HTTPS вызовы ajax со страницы не должны выполняться по HTTP. Ошибки, которые вы видите, являются ошибками браузера и изолированы от того, как настроен ваш elb.

person Shibashis    schedule 19.05.2016
comment
к сожалению, это не помогло. Это не имело никакого значения. Фактически, я также попытался удалить все 3 строки, и это не имело значения, если текущая страница уже отображается в HTTPS. Если текущая страница отображается в HTTP и строки удалены, значит, все работает правильно. Я также не думаю, что проблема в JavaScript. Я считаю, что это связано с конфигурацией ELB и тем, как он направляет трафик в EC2. Я просто не могу понять, как к этому подойти. - person Insider Pro; 19.05.2016
comment
Это схемы жесткого кодирования приложения ur в файлах js .. Оно должно быть построено динамически с использованием схемы, поступающей на сервер. - person Shibashis; 19.05.2016
comment
Извините, я не совсем понимаю, о чем вы говорите схемами. Все работает нормально, если я не использую HTTPS. - person Insider Pro; 19.05.2016
comment
После загрузки страницы по HTTPS запрос Ajax не должен отправлять запрос в HTTP .. независимо от того, где вы переключаетесь с HTTPS на HTTP, браузеры выдают такую ​​ошибку. - person Shibashis; 19.05.2016
comment
Спасибо за помощь, я понял, в чем проблема, см. Мой ответ, если вам интересно. - person Insider Pro; 20.05.2016

Я нашел решение и теперь отправляю ответ на свой вопрос. Не спрашивайте меня, как я это понял, потому что я не смогу дать вам однозначного ответа, но вот что это сделало:

$url = "/myapi/get_company?code=" + e;

изменился на:

$url = "/myapi/get_company/?code=" + e;

Обратите внимание на косую черту в конце прямо перед параметрами. Фактический файл, обрабатывающий вызовы AJAX на стороне сервера, находится здесь:

/myapi/get_company/index.php
person Insider Pro    schedule 20.05.2016

Убедитесь, что проблема на сервере, а не на клиенте. Ваш вызов AJAX относится к конечной точке API; Эта конечная точка API возвращает перенаправление HTTP, когда должно возвращать перенаправление HTTPS?

person Josh    schedule 05.05.2017