重写URL前缀为HTTP标头

重写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没有在股票五中提供给headersrack-rewrite的版本。

我想知道是否有一个更简单的方法来完成我在找什么。

+0

你有权访问$ 1变量吗?另外,我建议'%r {/([^/]*)/(.+)}',因为它没有逃生YMMV就更清晰了。 – iain 2013-04-09 21:03:02

+0

'$ 1'变量仅在第二个参数('/ $ 2')中可用。我的“hack”允许它在标题块内被访问(作为'base')。 – user2398029 2013-04-09 21:31:01

如果你看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} 

从你自己的分叉。