将URL前缀重写为HTTP标头

时间:2013-04-09 18:05:24

标签: ruby url-rewriting rewrite rack

我正在尝试使用rack-rewrite重写URL,如下所示:

/group1/feed变为/feed,标题为"GROUP_NAME" => "group1"

目前,我正在使用rack-rewrite的黑客版本,它允许我执行以下操作:

use Rack::Rewrite do
  rewrite /\/([^\/]*)\/(.+)/, '/$2',
  headers: lambda { |base, route| { 'GROUP_NAME' => base } }
end

请注意,base, route的库存版本中的headers块未提供rack-rewrite

我想知道是否有一种不那么愚蠢的方式来完成我正在寻找的东西。

1 个答案:

答案 0 :(得分:0)

如果你看the source, where rewrite is defined

def rewrite(*args)
  add_rule :rewrite, *args
end

你可以看到它需要一个args。 Following it to see the definition for add_rule

def add_rule(method, from, to, options = {}) #:nodoc:
  @rules << Rule.new(method.to_sym, from, to, options)
end

其中一个splatted参数是用于构建Rule实例的选项哈希。其中一个选项是:headers,获得added to a variable called additional_headers。然后是merged into the headers in some rules

不幸的是,rewrite is one of the few rules that it doesn't get merged in。这意味着您的问题的答案部分是“不”,因为当前的公共API无法帮助您解决此问题。就个人而言,我看不出有任何理由决定不将选项与此规则合并,如果我是你,我会分叉库并添加它,然后发送拉动请求让他们将它添加到主分支。在你等待的时候,你仍然可以做到:

rewrite /\/([^\/]*)\/(.+)/, '/$2', :headers => {"GROUP_NAME" => $1}

来自你自己的叉子。