nginx + SslRequirement + mongrel cluster = бесконечный цикл перенаправления
Я получаю бесконечный цикл перенаправления после добавления поддержки SSL на мой сайт. Я использую плагин "SslRequirement".
Симптомы, которые я вижу, это то, что любое действие, для которого включен ssl_required, и любой URL-адрес, который я набираю вручную, с https спереди, переходят в бесконечный цикл со следующим в файле development.log снова и снова. пока браузер не перехватит цикл перенаправления и не прекратит загрузку страницы (в этом примере это "/admins/index", но это происходит с любым действием):
Processing AdminsController#index (for 127.0.0.1 at 2010-08-13 13:50:16) [GET]
Parameters: {"action"=>"index", "controller"=>"admins"}
Redirected to https://localhost/admins
Filter chain halted as [:ensure_proper_protocol] rendered_or_redirected.
Completed in 0ms (DB: 0) | 302 Found [http://localhost/admins]
Сначала я подумал, что есть какая-то проблема, когда я должен был сделать ВСЕ мои действия "ssl_allowed" - так что я попробовал это, но безрезультатно.
ЕСЛИ я исключаю использование SslRequirement и удаляю все ссылки "ssl_required / ssl_allowed", то https работает нормально - поэтому проблема заключается в перенаправлении действий с http на https.
Есть какие-нибудь подсказки?
1 ответ
Ответ найден здесь:
http://www.hostingrails.com/SSL-Redirecting-not-working
Короткая версия, я добавил следующую строку в SSL vhost в моей конфигурации nginx:
proxy_set_header X_FORWARDED_PROTO https;
Подробная версия:
В основном проблема сводилась к тому, что сервер nginx не передавал тот факт, что исходный запрос был протоколом HTTPS, в кластер Mongrel. Это вызвало вызов "request.ssl?" внутри плагина SslRequirement ВСЕГДА возвращайте false.
Таким образом, когда это возвращается как ложное, "sure_proper_protocol" будет повторно выдавать действие через https, которое будет проверять "request.ssl?", Которое будет возвращать "false", которое будет повторно выдавать действие через https, что будет проверьте "request.ssl?", который будет возвращать "false", который будет перезапускать действие через https, который будет проверять "request.ssl?", который будет возвращать "false", который будет перезапускать действие поверх https, который проверял бы "request.ssl?", который возвращал бы "false", который перезапустил бы действие через https...
... вы поняли. Кластер mongrel НИКОГДА не думал, что запрос выполнен по протоколу HTTPS, поэтому он перенаправлен навсегда. Небольшое изменение в конфигурации nginx, чтобы исправить это, и BAM-O: проблема решена.