В настоящее время я реализую https
о нашей производственной среде, но я ломаю голову над одной мелочью.
SSL завершается в балансировщике нагрузки, и поток в нашем стеке в основном выглядит следующим образом:
Производство: Браузер <- https
-> Балансировщик нагрузки <- http
-> Apache <- http
-> Балансировщик нагрузки <- http
-> Tomcat
Тестирование: Браузер <- https
-> nginx <- http
-> Балансировщик нагрузки <- http
-> Tomcat
Когда я захожу на нашу страницу входа через HTTPS:
Заголовки запросов
POST /login/form HTTP/1.1
Host: www.example.org
Connection: keep-alive
Content-Length: 74
Cache-Control: max-age=0
Origin: https://www.example.org
Content-Type: application/x-www-form-urlencoded
Referer: https://www.example.org/login
Accept-Encoding: gzip,deflate,sdch
Accept-Language: nb,en-US;q=0.8,en;q=0.6
Заголовки ответа
HTTP/1.1 302 Moved Temporarily
Server: nginx
Date: Fri, 17 Jan 2014 11:16:50 GMT
Content-Length: 0
Connection: keep-alive
Set-Cookie: FOO=example
Location: http://www.example.org/portal
Strict-Transport-Security: max-age=31536000
Я поговорил с разработчиком, и он рассказал мне следующее:
В коде есть что-то вроде request.sendRedirect ("/ portal"), а Tomcat сделает все остальное.
Я могу воспроизвести проблему в тестовой среде, хотя стек немного другой.
Мои вопросы:
http
как схема в Location
-header, когда исходный запрос от браузера был сделан с https
?У меня была аналогичная проблема. Добавление следующего в конфигурацию виртуального хоста должно решить проблему. В основном он редактирует http-запрос на https
Header edit Location ^http://(.*)$ https://$1
Вы получаете http в заголовках ответов, потому что запрос, который достигает Apache, - это HTTP - SSL был удален в балансировщике нагрузки. Итак, из того, что видит Apache, это просто HTTP-запрос.
Вы можете обойти это, установив
ServerName https://www.example.org
в конфигурации глобального или виртуального хоста. Это переопределит схему http по умолчанию, поэтому Apache отправит нужный вам ответ. Документация для Название сервера упоминает об этом.
http://nginx.org/docs/http/ngx_http_proxy_module.html#proxy_redirect
proxy_redirect default;
proxy_redirect http://www.example.org/ https://www.example.org/;