似乎有不少用户正在寻找如何在 h2o 中重写 URL。 mruby 使它成为可能,但不清楚如何。 我很快解释了我最近的挑战:
在我们的服务器上,我们必须将查询字符串映射到服务器上的实际文件; 并且这些可能包含空格(或 URL 编码时的 %20)。 例如:
example.com/search?item=something%20and%somethingelse 应该得到文件
example.com/search/something_and_somethingelse
我阅读了h2o和Rack specs的mruby 示例,但我不太明白我需要写什么来告诉 h2o 使用不同的路径。 我可以读取 PATH_INFO 和 QUERY_STRING 环境变量,但是如何将新值传送回 h2o 服务器(“看这里而不是那里”)?
在相关说明中,我发现了一个看似众所周知的 gem,称为“ rack-rewrite ”。 我想知道,这是否可以帮助我制定重写规则,以及如何将这样的 gem 与我的 h2o 服务器相结合。 你在某处有一个例子吗?
我可以读取 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 似乎非常乏味和复杂。
最有用的评论
我不得不说,对于来自 NGINX 的人来说,为此使用 mruby 似乎非常乏味和复杂。