2012-02-29 10 views
0

ステージングサーバーに自己署名証明書をインストールしました。私はそれを使用して私のSSLのセットアップをテストしています。私はログインにDevise 1.5を使用しており、this article on the devise wiki for ssl/http configに従っています。ステージングサーバーでDevise with SSLを使用している場合、どのようにリダイレクトループを修正できますか?

を、サーバ(nginxのは、Apacheなど)上でSSLを有効にしてください:

ドキュメントが言います。 サーバが正しく設定されていないと、Railsは リクエストをSSLとして認識しません(そうであっても)。これは無限のリダイレクトループを引き起こします。

[OK]を確認してください、私は強く(私はEngineYardのインスタンスです)SSL上のスイッチを反転する必要はないと思う。私はSSL証明書をサーバーにインストールしました。

私は、ファイル/etc/nginx/servers/MyAppName.ssl.confを確認したのだが、これらの線があります右...

ssl on; 
    ssl_certificate /etc/nginx/ssl/MyAppName.crt; 
    ssl_certificate_key /etc/nginx/ssl/MyAppName.key; 
    ssl_prefer_server_ciphers on; 
    ssl_protocols SSLv3 TLSv1; 

だからそれが見えますか?私は確かにそれを混乱させたくありません。

私のRegistrationsControllerはforce_ssl :only => [:new, :create, :edit, :update]なので、すべての認証アクションはsslを強制的に強制する必要があります。 SessionsControllerはforce_ssl :only => [:new, :create]です。

私はここに多くの可動部品があることを認識していますが、次に見なければならないのは何ですか?

はここで、レールのログです:

Started GET "https://stackoverflow.com/users/sign_in" for 98.246.164.160 at 2012-02-29 20:47:39 +0000 
[29 Feb 20:47 23166 INFO] Processing by Devise::SessionsController#new as HTML 
[29 Feb 20:47 23166 DEBUG] Parameters: {"action"=>"new", "controller"=>"devise/sessions"} 
[29 Feb 20:47 23166 INFO] Redirected to https://ec2-xxx-xxx-106-255.us-west-2.compute.amazonaws.com/users/sign_in 
[29 Feb 20:47 23166 INFO] Completed 301 Moved Permanently in 1ms 
[29 Feb 20:47 23166 INFO] 

Started GET "https://stackoverflow.com/users/sign_in" for 98.246.164.160 at 2012-02-29 20:47:39 +0000 
[29 Feb 20:47 23166 INFO] Processing by Devise::SessionsController#new as HTML 
[29 Feb 20:47 23166 DEBUG] Parameters: {"action"=>"new", "controller"=>"devise/sessions"} 
[29 Feb 20:47 23166 INFO] Redirected to http://ec2-xxx-xxx-106-255.us-west-2.compute.amazonaws.com/users/sign_in 
[29 Feb 20:47 23166 INFO] Completed 302 Found in 1ms 
[29 Feb 20:47 23166 INFO] 

Started GET "https://stackoverflow.com/users/sign_in" for 98.246.164.160 at 2012-02-29 20:47:39 +0000 
[29 Feb 20:47 23166 INFO] Processing by Devise::SessionsController#new as HTML 
[29 Feb 20:47 23166 DEBUG] Parameters: {"action"=>"new", "controller"=>"devise/sessions"} 
[29 Feb 20:47 23166 INFO] Redirected to https://ec2-xxx-xxx-106-255.us-west-2.compute.amazonaws.com/users/sign_in 
[29 Feb 20:47 23166 INFO] Completed 301 Moved Permanently in 1ms 

答えて

0

これを解決するには、要旨から「ensure_proper_protocol」メソッドに嘘をつきました。私はそれをより読みやすくするために、それを名前を変更し、それが次のようになります。オリジナルはusers/sessionsを使用したこと

def ssl_forced_action? 
    (params[:controller] == 'devise/sessions' && ['new', 'create'].include?(params[:action])) || 
     (params[:controller] == 'devise/registrations' && ['new', 'create', 'edit', 'update'].include?(params[:action])) || 
     (params[:controller] == 'users/omniauth_callbacks') 
    end 

注意。

0

Googleでここに到着した方には、私の一日を無駄にしたこの問題の別の原因を掲載してください。うまくいけばあなたのことを浪費しません。

あなたが本番環境でPassengerを使用していて、それをApacheのVirtualHost(たとえばconf/httpd.conf)で設定していて、conf.d/ssl.confで設定しないと、ループの問題。この誤った構成で問題が発生した場合の症状は、要求に明示的にhttpsを入力した場合でも、request.ssl?は常にfalseになります。それは常にあなたがそれをhttps://whatever要求を送信するとき、その後、VirtualHostの設定が問題かもしれませんでも==== ssl: falseをログに記録する場合

class ApplicationController < ActionController::Base 
before_filter :check_ssl 

    def check_ssl 
    logger.info("==== ssl: #{request.ssl? }") 
    end 

end 

:あなたの症状を確認するには、次のようなものでapplication_controller.rbにbefore_filterデバッグフックを置くことができます。 VirtualHostのconf.d/ssl.confにあなたのレールアプリのDocumentRootとDirectoryのディレクティブを置くと、問題が解決されます。少なくともそれは私のためにした。

+0

request.ssl == falseの場合、おそらく、乗客の代理人は、ApacheがSSLを使用していることを知らないことを意味します。 VirtualHostファイルに 'RequestHeader set X-Forwarded-Proto" https "をSSLのために置く必要があります。 – paleozogt

関連する問題