我正在尝试使用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
。
我想知道是否有一种不那么愚蠢的方式来完成我正在寻找的东西。
答案 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}
来自你自己的叉子。