2

我正在尝试使用以下方式重写 URL rack-rewrite

/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

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

4

1 回答 1

0

如果您查看源代码,则在哪里rewrite定义

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

你可以看到它需要一些参数。跟随它查看定义add_rule

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

这些 splatted 参数之一是用于构建Rule实例的选项哈希。其中一个选项是:headers,它被添加到一个名为 的变量additional_headers中。然后将其合并到某些规则的标题中

不幸的是,rewrite它是少数几个没有合并到. 这意味着您的问题的答案部分是“否”,因为当前的公共 API 无法帮助您解决这个问题。就个人而言,我看不出有任何理由决定不将选项与此规则合并,如果我是你,我会分叉库并添加它,然后发送拉取请求让他们将其添加到主分支. 在等待期间,您仍然可以执行以下操作:

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

从你自己的叉子。

于 2013-04-10T01:22:36.627 回答