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?
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.
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.