У меня есть приложение (статический веб-сайт), которое обслуживается внутри системы по протоколу HTTP, но доступ из браузеров конечных пользователей вынужден использовать HTTPS через балансировщик нагрузки:
+-------------------------+ +----------------------------------+
| browser | |load balancer to which |
| http://www.example.com | |www.example.com is resolved |
| or +---> - listens on 80 and 443 |
| https://www.example.com | | - rewrites http:// into https:// |
| | | |
+-------------------------+ +---------------+------------------+
|
+---------------v-------------+
|actual server which listens |
|on someip:80 |
| |
+-----------------------------+
Моя веб-страница загружает сценарии JavaScript и CSS с помощью классических записей, таких как <script src='/script/hello.js'></script>
или <link rel="stylesheet" href="/static/main.min.css">
Иногда случается, что эти скрипты /CSS не загружаются (страница отображается без CSS и JS, поэтому она явно некорректна) в первый раз (это нормально, если нажать F5 для перезагрузки страницы), и мне удалось отловить ошибку в Chrome Dev Tools:
Mixed Content: The page at 'https://www.example.com/status/' was loaded over HTTPS, but requested an insecure script 'http://www.example.com.com/static/jquery.min.js?ticket=ST-1233778-1feFoRbZPxS0ICdkJeR6-cas'. This request has been blocked; the content must be served over HTTPS.
Сообщение ясно: общая страница HTTP S содержит компоненты, которые являются только HTTP.
Мой вопрос: почему они HTTP, а не HTTPS?
- вызовы относительны, поэтому независимо от того, что страница должна быть добавлена к относительному пути
- Я полагаю, что ошибка возникает, когда кто-то делает первоначальный вызов через
http://
(в противном случае не было бы проблем) - но в этом случае происходит то, что
- пользователь вводит
http://
и этот запрос покидает браузер ... - ... прибывает на балансировщик нагрузки ...
- ... который перенаправляет запрос как
http://
(поэтому сервер получает вызовhttp
) ... - ... содержимое доставляется обратно в балансировщик нагрузки ...
- который преобразует вызов в
https://
- пользователь вводит
Я не понимаю, где может быть создан смешанный контент и почему это только для первого обращения к странице, исправлено обновлением через F5.