Назад | Перейти на главную страницу

http в заголовке Location, когда исходный запрос был сделан через https

В настоящее время я реализую 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 сделает все остальное.

Я могу воспроизвести проблему в тестовой среде, хотя стек немного другой.

Мои вопросы:

  1. Почему я получаю http как схема в Location-header, когда исходный запрос от браузера был сделан с https?
  2. Это проблема Apache mod_rewrite / mod_proxy или nginx?
  3. Это проблема с Tomcat?

У меня была аналогичная проблема. Добавление следующего в конфигурацию виртуального хоста должно решить проблему. В основном он редактирует 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/;