2010-06-01 50 views
2

我有一个简单的Sinatra代理,当一个端点被调用时,它将重定向到同一个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 

任何提示将不胜感激。

谢谢

回答

2

这是故意的。 redirect触发一个HTTP重定向,一个新的请求将被触发。此外,传递env的值是通过修改env而不是response完成的。

主要问题是,您的头是什么意思?请求标头或响应标头?从你的例子我想你的意思是请求标题,因此response['username'] = username应该是request.env['username'] = username。然后,您可以用request.path_info = '/second'; pass替换redirect '/second'来执行某种内部重定向。如果您没有将该值传递给另一个Rack中间件/端点,则还可以将用户名存储在实例变量中。

get '/first' do 
    request.path_info = '/second' 
    pass 
end 

get '/second' do 
    puts request.env['HTTP_USERNAME'] 
    "DONE" 
end 
+0

谢谢康斯坦丁 - 那正是我一直在寻找的。我清理忘了我可以使用pass方法。干杯。 – emson 2010-06-07 13:05:36