我有一个简单的Sinatra代理,当调用端点时,它会重定向到同一个Sinatra代理上的另一个端点。
当我使用标头发出请求时,当请求在第一个端口重定向时,代理似乎没有将此标头传递到第二个端点。这是我的代码:
get '/first' do
# get the header from the request
username = env['HTTP_USERNAME']
# set the header for the response
response['username'] = username
redirect '/second'
end
get '/second' do
# This doesn't exist when redirected from /first
puts env['HTTP_USERNAME']
# Here is a list of all headers
env.each_key do |key|
puts "KEY: #{key} VALUE: #{env[key]}" unless key.nil?
end
"DONE"
end
任何提示都将不胜感激。
由于
答案 0 :(得分:2)
这是故意的。 redirect
触发HTTP重定向,将触发新请求。此外,传递env
值是通过修改env
而不是response
完成的。
主要问题是,标题是什么意思?请求标头或响应标头?在您的示例中,我认为您的意思是请求标头,因此response['username'] = username
应为request.env['username'] = username
。然后,您可以将redirect '/second'
替换为request.path_info = '/second'; pass
以执行某种内部重定向。如果未将值传递给另一个Rack中间件/端点,则还可以将用户名存储在实例变量中。
get '/first' do
request.path_info = '/second'
pass
end
get '/second' do
puts request.env['HTTP_USERNAME']
"DONE"
end