2

我有一个简单的 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

任何提示将非常感谢。

谢谢

4

1 回答 1

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
于 2010-06-06T17:01:34.337 回答