H2o: Reescribe ... de nuevo, lo siento!

Creado en 4 feb. 2016  ·  3Comentarios  ·  Fuente: h2o/h2o

Parece que hay bastantes usuarios que buscan cómo reescribir URL en h2o. mruby lo hace posible, pero no está claro cómo. Explico rápidamente mi último desafío:

En nuestro servidor, tenemos que asignar cadenas de consulta a archivos reales en el servidor; y estos pueden incluir espacios en blanco (o% 20 cuando están codificados como URL). Por ejemplo:
example.com/search?item=something%20and%somethingelse debería obtener el archivo
example.com/search/something_and_somethingelse

Leí los ejemplos de mruby para h2o y las especificaciones de Rack , pero no entiendo muy bien lo que necesito escribir para decirle a h2o que use una ruta diferente. Puedo leer las variables de entorno PATH_INFO y QUERY_STRING, pero ¿cómo comunico los nuevos valores al servidor h2o ("mira aquí en lugar de allí")?

En una nota relacionada, encontré una joya aparentemente muy conocida llamada " reescritura en rack ". Y me preguntaba si esto podría ayudarme con mis reglas de reescritura, y cómo podría combinarse una joya con mi servidor h2o. ¿Tienes un ejemplo en alguna parte?

enhancement help wanted mruby

Comentario más útil

Tengo que intervenir al decir que usar mruby para esto parece muy tedioso y complicado para alguien que viene de NGINX.

Todos 3 comentarios

Puedo leer las variables de entorno PATH_INFO y QUERY_STRING, pero ¿cómo comunico los nuevos valores al servidor h2o ("mira aquí en lugar de allí")?

Debe establecer reproxy: on en su archivo de configuración y devolver una respuesta con un conjunto de encabezado x-reproxy-url . Eso indica al controlador de reproxy que devuelva el contenido de la URL especificada con el encabezado.
ver también: https://h2o.examp1e.net/configure/mruby_directives.html#delegating -request

En una nota relacionada, encontré una joya aparentemente muy conocida llamada "reescritura en rack". Y me preguntaba si esto podría ayudarme con mis reglas de reescritura, y cómo podría combinarse una joya con mi servidor h2o. ¿Tienes un ejemplo en alguna parte?

Rack-rewrite depende de las _bibliotecas_ proporcionadas por Rack, y me temo que no puede usarlo como está desde mruby (aunque IMO portarlo a mruby no sería difícil).

Entiendo que existe la necesidad de una forma más declarativa de especificar redireccionamientos en lugar de escribir las reglas usando mruby; Sería genial si alguien pudiera crear un puerto de reescritura en rack o algo similar.

¡Muchas gracias! Ahora lo tengo.

Para que conste, y para todos los que busquen algo similar: la siguiente parte de h2o.conf reemplaza un solo espacio vacío con un guión bajo en todas las URL en / test /

Por ejemplo, https://www.example.com/test/something%20and%20somethingelse se reescribe a
https://www.example.com/test/something_and_somethingelse

Si h2o no encuentra el archivo reescrito, lo redirecciona internamente a un script PHP que, en mi caso, realiza una búsqueda en una base de datos para obtener el contenido deseado.

      "/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

Tengo que intervenir al decir que usar mruby para esto parece muy tedioso y complicado para alguien que viene de NGINX.

¿Fue útil esta página
0 / 5 - 0 calificaciones

Temas relacionados

utrenkner picture utrenkner  ·  8Comentarios

chenbd picture chenbd  ·  3Comentarios

daniel-lucio picture daniel-lucio  ·  5Comentarios

proyb6 picture proyb6  ·  5Comentarios

ndac-todoroki picture ndac-todoroki  ·  5Comentarios