重写URL前缀为HTTP标头
问题描述:
我试图重写URL使用rack-rewrite
如下:重写URL前缀为HTTP标头
/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
的版本。
我想知道是否有一个更简单的方法来完成我在找什么。
答
如果你看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}
从你自己的分叉。
你有权访问$ 1变量吗?另外,我建议'%r {/([^/]*)/(.+)}',因为它没有逃生YMMV就更清晰了。 – iain 2013-04-09 21:03:02
'$ 1'变量仅在第二个参数('/ $ 2')中可用。我的“hack”允许它在标题块内被访问(作为'base')。 – user2398029 2013-04-09 21:31:01