H2o: 重写...再次,对不起!

创建于 2016-02-04  ·  3评论  ·  资料来源: h2o/h2o

似乎有不少用户正在寻找如何在 h2o 中重写 URL。 mruby 使它成为可能,但不清楚如何。 我很快解释了我最近的挑战:

在我们的服务器上,我们必须将查询字符串映射到服务器上的实际文件; 并且这些可能包含空格(或 URL 编码时的 %20)。 例如:
example.com/search?item=something%20and%somethingelse 应该得到文件
example.com/search/something_and_somethingelse

我阅读了h2oRack specsmruby 示例,但我不太明白我需要写什么来告诉 h2o 使用不同的路径。 我可以读取 PATH_INFO 和 QUERY_STRING 环境变量,但是如何将新值传送回 h2o 服务器(“看这里而不是那里”)?

在相关说明中,我发现了一个看似众所周知的 gem,称为“ rack-rewrite ”。 我想知道,这是否可以帮助我制定重写规则,以及如何将这样的 gem 与我的 h2o 服务器相结合。 你在某处有一个例子吗?

enhancement help wanted mruby

最有用的评论

我不得不说,对于来自 NGINX 的人来说,为此使用 mruby 似乎非常乏味和复杂。

所有3条评论

我可以读取 PATH_INFO 和 QUERY_STRING 环境变量,但是如何将新值传送回 h2o 服务器(“看这里而不是那里”)?

您应该在配置文件中设置reproxy: on并返回带有x-reproxy-url标头集的响应。 这会指示代理处理程序返回使用标头指定的 URL 的内容。
另见: https: //h2o.examp1e.net/configure/mruby_directives.html#delegating -request

在相关说明中,我发现了一个看似众所周知的 gem,称为“rack-rewrite”。 我想知道,这是否可以帮助我制定重写规则,以及如何将这样的 gem 与我的 h2o 服务器相结合。 你在某处有一个例子吗?

Rack-rewrite 依赖于 Rack 提供的 _libraries_,恐怕你不能像 mruby 那样使用它(尽管 IMO 将它移植到 mruby 并不难)。

我确实理解需要一种更具声明性的方式来指定重定向,而不是使用 mruby 写下规则; 如果有人能想出一个机架重写端口或类似的东西,那就太好了。

非常感谢! 现在我懂了。

作为记录 - 每个人都在寻找类似的东西:h2o.conf 的以下部分在 /test/ 下的所有 URL 中用下划线替换了一个空格

例如https://www.example.com/test/something%20and%20somethingelse被重写为
https://www.example.com/test/something_and_somethingelse

如果 h2o 找不到重写的文件,它会在内部重定向到一个 PHP 脚本 - 在我的情况下 - 从数据库中进行查找以获取所需的内容。

      "/test":
        reproxy: ON
        mruby.handler: |
          lambda do |env|
            if /^\/([^ ]+[ ][^ ]+)/.match(env["PATH_INFO"]) # All URLs with at least one empty space NOT in the beginning or end
              str = "#{$1}"
              str = str.gsub( %r{[ ]}, '_') # replace every single empty space with an underscore
              return [307, {"x-reproxy-url" => "https://www.example.com/test/#{str}"}, []] # reproxy to rewritten URL
            end
            return [399, {}, []]
          end
        file.dir: "/usr/local/www/apache22/data/test/json"   # serve static files if found
        redirect:           # if not found, internally redirect to /test/index.php/<path>
          url: /test/index.php/
          internal: YES
          status: 307

我不得不说,对于来自 NGINX 的人来说,为此使用 mruby 似乎非常乏味和复杂。

此页面是否有帮助?
0 / 5 - 0 等级

相关问题

xm74 picture xm74  ·  15评论

ahupowerdns picture ahupowerdns  ·  8评论

aafanasyev picture aafanasyev  ·  10评论

kazuho picture kazuho  ·  15评论

utrenkner picture utrenkner  ·  11评论