H2o: Reescrever ... de novo, desculpe!

Criado em 4 fev. 2016  ·  3Comentários  ·  Fonte: h2o/h2o

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?

enhancement help wanted mruby

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.

Todos 3 comentários

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.

Esta página foi útil?
0 / 5 - 0 avaliações

Questões relacionadas

utrenkner picture utrenkner  ·  7Comentários

daniel-lucio picture daniel-lucio  ·  5Comentários

Ys88 picture Ys88  ·  5Comentários

Ys88 picture Ys88  ·  5Comentários

paulpref picture paulpref  ·  5Comentários