nginx + SslRequirement + mongrel cluster = бесконечный цикл перенаправления - PullRequest
1 голос
/ 13 августа 2010

Я получаю бесконечный цикл перенаправления после добавления поддержки 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 Ответ

2 голосов
/ 14 августа 2010

Ответ найден здесь:

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?», которое возвращает «ложь», что перезапускает действие через https ...

... вы поняли идею. Кластер mongrel НИКОГДА не думал, что запрос выполнен по протоколу HTTPS, поэтому он перенаправлен навсегда. Небольшое изменение в конфигурации nginx, чтобы исправить это, и BAM-O: проблема решена.

...