2010-08-13 3 views
1

Я получаю бесконечный цикл перенаправления после добавления поддержки SSL на мой сайт. Я использую плагин «SslRequirement».nginx + SslRequirement + mongrel cluster = бесконечный цикл перенаправления

Симптомы, которые я вижу, - это любое действие с включенным «ssl_required», и любой URL-адрес, который я вводил вручную, который имеет https спереди, переходит в бесконечный цикл, причем в файле development.log указано следующее: , снова и снова, пока браузер не ловит петлю переадресации и останавливает загрузку страницы («/ администраторы/индекс» это действие в этом примере, но это происходит с любым действием):

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] 

на первом I подумал, что есть какая-то проблема, когда мне пришлось сделать ВСЕ мои действия «ssl_allowed» - поэтому я попробовал это, но безрезультатно.

Если я удалю использование SslRequirement и удаляю любые ссылки «ssl_required/ssl_allowed», то https работает нормально - так что это перенаправление в действиях с http на https, что кажется проблемой.

Любые подсказки?

ответ

2

Ответ здесь:

http://www.hostingrails.com/SSL-Redirecting-not-working

Короткая версия, я добавил следующую строку в SSL виртуальный хост в моем Nginx конфигурации:

proxy_set_header X_FORWARDED_PROTO HTTPS;


Подробная версия:

В основном вопрос свелся к серверу Nginx не передавая тот факт, что запрос на источник был протокол HTTPS на кластере Mongrel. Это вызвало вызов «request.ssl?» внутри плагина SslRequirement, чтобы ВСЕГДА возвращали false.

Итак, если это вернётся как ложное, функция «обеспечить_proper_protocol» повторно запустит действие над https, которое будет проверять «request.ssl?», Которое вернет «false», что приведет к повторному действию https, который будет проверять «request.ssl?», который вернет «false», что приведет к повторному выпуску действия над https, который будет проверять «request.ssl?», который вернет «false», выполните действие над https, которое проверит «request.ssl?», который вернет «false», что приведет к повторному выпуску действия над https ...

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