Parece que há alguns usuários que estão procurando como reescrever URLs no H2o. mruby torna isso possível, mas não está claro como. Eu explico rapidamente meu último desafio:
Em nosso servidor, temos que mapear strings de consulta para arquivos reais no servidor; e podem incluir espaços em branco (ou% 20 quando codificado por URL). Por exemplo:
example.com/search?item=something%20and%somethingelse deve obter o arquivo
example.com/search/something_and_somethingelse
Eu li os exemplos do especificações do
Em uma nota relacionada, eu encontrei uma gema aparentemente bem conhecida chamada " rack-rewrite ". E eu queria saber se isso pode me ajudar com minhas regras de reescrita, e como tal joia poderia ser combinada com meu servidor h2o. Você tem um exemplo em algum lugar?
Posso ler as variáveis de ambiente PATH_INFO e QUERY_STRING, mas como faço para comunicar os novos valores de volta ao servidor h2o ("olhe aqui em vez de ali")?
Você deve definir reproxy: on
em seu arquivo de configuração e retornar uma resposta com um conjunto de cabeçalhos x-reproxy-url
. Isso instrui o manipulador de reproxy a retornar o conteúdo do URL especificado com o cabeçalho.
veja também: https://h2o.examp1e.net/configure/mruby_directives.html#delegating -request
Em uma nota relacionada, eu encontrei uma gema aparentemente bem conhecida chamada "rack-rewrite". E eu queria saber se isso pode me ajudar com minhas regras de reescrita, e como tal joia poderia ser combinada com meu servidor h2o. Você tem um exemplo em algum lugar?
A reescrita em rack depende das _libraries_ fornecidas pelo Rack, e infelizmente você não pode usá-la como está no mruby (embora a IMO portá-la para mruby não seja difícil).
Eu entendo que há uma necessidade de uma maneira mais declarativa de especificar redirecionamentos em vez de escrever as regras usando mruby; seria ótimo se alguém pudesse criar uma porta de reescrita em rack ou algo semelhante.
Muito obrigado! Agora entendi.
Para registro - e todos que procuram algo semelhante: a seguinte parte de h2o.conf substitui um único espaço vazio por um sublinhado em todos os URLs em / test /
Por exemplo, https://www.example.com/test/something%20and%20somethingelse foi reescrito para
https://www.example.com/test/something_and_somethingelse
Caso a H2o não encontre o arquivo reescrito, ele redireciona internamente para um script PHP que - no meu caso - faz uma consulta em um banco de dados para buscar o conteúdo desejado.
"/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
Eu tenho que gritar dizendo que usar mruby para isso parece muito tedioso e complicado para alguém que vem do NGINX.
Comentários muito úteis
Eu tenho que gritar dizendo que usar mruby para isso parece muito tedioso e complicado para alguém que vem do NGINX.