質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
Ruby on Rails 5

Ruby on Rails 5は、オープンソースのWebアプリケーションフレームワークです。「同じことを繰り返さない」というRailsの基本理念のもと、他のフレームワークより少ないコードで簡単に開発できるよう設計されています。

nginx

nginixは軽量で高性能なwebサーバーの1つです。BSD-likeライセンスのもとリリースされており、あわせてHTTPサーバ、リバースプロキシ、メールプロキシの機能も備えています。MacOSX、Windows、Linux、上で動作します。

Q&A

解決済

1回答

1657閲覧

Rails + Nginx + puma でsession情報がリダイレクトで消えてしまう

lyzmfeqpxs54

総合スコア237

Ruby on Rails 5

Ruby on Rails 5は、オープンソースのWebアプリケーションフレームワークです。「同じことを繰り返さない」というRailsの基本理念のもと、他のフレームワークより少ないコードで簡単に開発できるよう設計されています。

nginx

nginixは軽量で高性能なwebサーバーの1つです。BSD-likeライセンスのもとリリースされており、あわせてHTTPサーバ、リバースプロキシ、メールプロキシの機能も備えています。MacOSX、Windows、Linux、上で動作します。

0グッド

0クリップ

投稿2019/12/03 07:57

いつもお世話になっております。
現在RailsでWebページを作成しております。

Eメールアドレスと、パスワードを入力し、POSTすると以下のような形でloginメソッドが呼ばれ、成功時にmypageにリダイレクトという流れで処理を行っています。
mypageのshowでlogged_in?メソッドを使用して、セッション情報の有無を確かめて、そのページを表示させるかをコントロールしています。

RailsサーバーをNginxをかませて
$ bundle exec pumactl start
で起動した場合

log_inメソッドで
session[:user_id] = user.id
としてsession[:user_id]に「1」という値を代入しているのですが、
リダイレクト後に、sessionの中の情報が消えてしまいます(session[:user_id]を打つとnil)。
以下コードのようにpryで止めて確認しました。

puma + Railsとして
$ sudo ~/.rbenv/shims/bundle exec rails s -b 0.0.0.0 -p 80
で起動した場合にはsessionは正しく保持されている状態です(リダイレクト後もsession[:user_id]を打つと「1」)

ruby

1 # Sessionsコントローラー 2 def login 3 user = User.find_by(email: params[:email]) 4 # ユーザーが存在し、パスワードが合っていたらログイン可 5 if user && user.authenticate(params[:password]) 6 # login処理 7 # binding.pry(この時点でsession[:user_id]するとnil) 8 log_in user 9 # binding.pry(この時点でsession[:user_id]すると「1」) 10 redirect_to controller: 'mypages', action: 'show' 11 else 12 @error_email = params[:email] 13 @error_password = params[:password] 14 @error_login = 'メールアドレスまたはパスワードが間違っています' 15 render 'logins/show' 16 end 17 end 18 19 # SessionHelper 20 def log_in(user) 21 session[:user_id] = user.id 22 end 23 24 # ユーザーがログインしていればtrue、その他ならfalseを返す 25 def logged_in? 26 !current_user.nil? 27 end 28 29 # mypagesコントローラー 30 def show 31 # binding.pry(この時点でsession[:user_id]するとnil) 32 if logged_in? 33 @user = User.find(session[:user_id]) 34 render 'mypages/show' 35 else 36 redirect_to controller: 'tops', action: 'show' 37 end 38 end 39

Nginxを使用した場合にsession情報が消えているように思えるのですが、そういったことはNginxで設定する必要があるのでしょうか。

参考になるサイトでも構いませんので、適切な方法をご教示いただけますと幸いです。
よろしくお願いいたします。

環境
Amazon Linux release 2 (Karoo)
Rails 5.2.3
Ruby version: 2.6.1

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

自己解決

詳しい状況はわからないのですが、
/etc/nginx/nginx.confに下記を記載することで解決いたしました。

location {
proxy_set_header X-Forwarded-Server $host;
proxy_set_header X-Forwarded-Proto https;
proxy_set_header X-Real-IP $remote_addr;
}

投稿2019/12/09 06:19

lyzmfeqpxs54

総合スコア237

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問