Ruby 向机架重写响应添加查询字符串

Ruby 向机架重写响应添加查询字符串,ruby,url-rewriting,rack-rewrite,Ruby,Url Rewriting,Rack Rewrite,我有一个简单的301重定向来捕获我为我的站点注册的所有非.com域,如下所示: DOMAIN = 'www.mywebsite.com' use Rack::Rewrite do r301 %r{.*}, "http://#{DOMAIN}$&", :if => Proc.new {|rack_env| rack_env['SERVER_NAME'] != DOMAIN && ENV["RACK_ENV"] == 'production' } en

我有一个简单的301重定向来捕获我为我的站点注册的所有非.com域,如下所示:

DOMAIN = 'www.mywebsite.com'

use Rack::Rewrite do
  r301 %r{.*}, "http://#{DOMAIN}$&", :if => Proc.new {|rack_env|
    rack_env['SERVER_NAME'] != DOMAIN && ENV["RACK_ENV"] == 'production'
  }
end
我想在响应中添加一个querystring,以添加格式为的原始域

?utm_source=#{rack_env['SERVER_NAME']}
但无法完全解决如何不使服务器崩溃:)可以这样做并保留任何原始查询字符串吗


不太可能有人会点击主域下的任何子页面,但是当我从重写中删除$&并用我的字符串替换它时,它在日志中没有错误…

我认为原始代码无法工作的原因是
rack_env
在第二个参数中不可用,因为它是第三个参数的块参数。这有意义吗

但是,您可以将Proc作为重定向的第二个参数传递,因此我认为类似的方法应该可以工作(部分测试:)


这简直是一针见血!非常感谢。我只需将第一个块中的REQUEST_URI更改为SERVER_NAME,它就可以完美地工作了!好极了:)你能赏金给我吗?谢谢;)希望它能正确地奖励给你-如果没有,请告诉我。它有,谢谢:)我不知道这个赏金的东西是如何工作的:)
DOMAIN = 'www.mywebsite.com'

ORIGINAL_REQUEST = Proc.new do |match, rack_env|
  "#{DOMAIN}?utm_source=#{rack_env['REQUEST_URI']}"
end

use Rack::Rewrite do
  r301 %r{.*}, ORIGINAL_REQUEST, :if => Proc.new {|rack_env|
    rack_env['SERVER_NAME'] != DOMAIN && ENV["RACK_ENV"] == 'production'
  }
end