MixedContent, когда я загружаю страницу https через ajax, но браузер все еще думает, что это http
После установки SSL-сертификата на веб-страницу у меня возникла проблема, когда для страницы, обслуживаемой с помощью https, требовалась конечная точка http с ajax. Я использую Restrict, и я изменил базовый URL, чтобы иметь https.
var uri = location.protocol + "//" + location.host;
RestangularProvider.setBaseUrl(uri);
Интересно то, что когда я вижу запрос в инструментах разработчика Chrome, я вижу
Request URL:https://theaddress.com/api/endpoint
Request Headers
Provisional headers are shown
Accept:application/json, text/plain, */*
Referer:https://theadress.com/somepage
User-Agent:Mozilla/5.0 (Macintosh; Intel Mac OS X 10_10_1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/40.0.2214.93 Safari/537.36
X-Requested-With:XMLHttpRequest
Таким образом, запрос должен быть https, но я все еще получаю:
Mixed Content: The page at 'https://theaddress.com/somepage' was loaded over HTTPS, but requested an insecure XMLHttpRequest endpoint 'http://theadress.com/api/endpoint'. This request has been blocked; the content must be served over HTTPS.
Также я должен упомянуть, что это происходит на сервере prod, но в моем локальном тесте он работает нормально (у меня есть самоподписанный сертификат ssl) после того, как я заставил его использовать базовый URL, включающий https.
В чем может быть проблема?
2 ответа
Я потратил добрые 4 часа, пытаясь решить подобную проблему. Вот что решил мой:
Резюме: добавьте завершающий символ "/" к вашему запросу
Я нашел этот пост полезным для решения моей проблемы. По сути, серверу все равно, отправляете ли вы свой запрос с завершающим знаком "/" или нет, потому что он внутренне перенаправляется на "/", если вы его не добавляете. Однако, если маршрутизация происходит внутри системы (например, nginx передает запрос локальному процессу), вы получаете перенаправление http, которое приведет к сбою вашего запроса.
Я попытался @Kadi исправить косую черту, и это сработало, но более элегантным решением для меня было изменить запрос с GET на POST, что также решило проблему.
Все еще не уверен, что было причиной.