【问题标题】:Rewrite URL prefix into HTTP header将 URL 前缀重写为 HTTP 标头
【发布时间】:2013-04-09 18:05:24
【问题描述】:

我正在尝试使用 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 未提供给 rack-rewrite 库存版本中的 headers 块。

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

【问题讨论】:

  • 您可以访问 $1 变量吗?另外,我建议%r{/([^/]*)/(.+)},因为没有转义,YMMV 会更清晰。
  • $1 变量仅在第二个参数 (/$2) 中可用。我的“hack”允许在 headers 块内访问它(作为base)。

标签: ruby url-rewriting rewrite rack


【解决方案1】:

如果你看the source, where rewrite is defined

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

你可以看到它需要一些参数。 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}

来自你自己的分叉。

【讨论】:

    猜你喜欢
    • 2020-10-06
    • 1970-01-01
    • 1970-01-01
    • 2011-01-13
    • 2019-11-20
    • 2020-05-26
    • 2022-11-24
    • 2015-04-13
    • 2014-09-20
    相关资源
    最近更新 更多