enable :sessions
set :session_secret, 'secret'
post '/login' do
session[:loggedInUser] = jsondata['username'].to_s
puts session[:loggedInUser] + " is the session"
end
在这一点上一切都很好。当我读到这样的会话时:
get '/debug' do
session.inspect
end
它都在那里。但问题来了。当我稍后去另一个帖子请求时:
post '/foo' do
# do nothing
end
会话被清除。
为什么?这是一个错误吗?
编辑
我已经缩小了问题的范围:我通过 nginx 代理 Sinatra,到http://app.local/backend
- 这就是问题发生的时候。如果我通过它运行 Sinatra http://localhost:4567
,一切都会按预期工作。
解决方案
使用Rack::Session::Cookie
而不是默认值enable :sessions
:
use Rack::Session::Cookie, :key => "rack.session",
:path => "/backend"
# etc
如果您需要为会话设置其他参数,例如到期日期,请直接使用 Rack::Session::Cookie 而不是 enable :sessions: