Кажется, довольно много пользователей ищут, как переписать URL-адреса в h2o. mruby делает это возможным, но непонятно как. Я быстро объясняю свою последнюю задачу:
На нашем сервере мы должны сопоставить строки запроса с фактическими файлами на сервере; и они могут включать пробелы (или% 20 при кодировке URL). Например:
example.com/search?item=something%20and%somethingelse должен получить файл
example.com/search/something_and_somethingelse
Я прочитал примеры mruby для h2o и спецификации стойки , но я не совсем понимаю, что мне нужно написать, чтобы указать h2o использовать другой путь. Я могу читать переменные среды PATH_INFO и QUERY_STRING, но как мне передать новые значения обратно на сервер h2o («смотрите здесь, а не там»)?
В связи с этим я обнаружил, казалось бы, хорошо известную жемчужину под названием « перезапись стойки ». И мне было интересно, может ли это помочь мне с моими правилами перезаписи и как такой драгоценный камень можно объединить с моим сервером H2O. У вас есть где-нибудь пример?
Я могу читать переменные среды PATH_INFO и QUERY_STRING, но как мне передать новые значения обратно на сервер h2o («смотрите здесь, а не там»)?
Вы должны установить reproxy: on
в своем файле конфигурации и вернуть ответ с установленным заголовком x-reproxy-url
. Это указывает обработчику репроксимации вернуть содержимое URL-адреса, указанного в заголовке.
см. также: https://h2o.examp1e.net/configure/mruby_directives.html#delegating -request
В связи с этим я обнаружил, казалось бы, хорошо известную жемчужину под названием «перезапись стойки». И мне было интересно, может ли это помочь мне с моими правилами перезаписи и как такой драгоценный камень можно объединить с моим сервером H2O. У вас есть где-нибудь пример?
Перезапись стойки зависит от _libraries_, предоставляемых Rack, и я боюсь, что вы не можете использовать ее как есть из mruby (хотя IMO перенести ее на mruby не составит труда).
Я понимаю, что существует потребность в более декларативном способе указания перенаправлений, а не в написании правил с помощью mruby; Было бы здорово, если бы кто-нибудь мог придумать порт для перезаписи стойки или что-то подобное.
Большое спасибо! Теперь я понимаю.
Для справки - и всем, кто ищет что-то подобное: следующая часть h2o.conf заменяет одно пустое пространство подчеркиванием во всех URL-адресах в / test /
Например, 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
Я должен сказать, что использование mruby для этого кажется очень утомительным и сложным для тех, кто работает с NGINX.
Самый полезный комментарий
Я должен сказать, что использование mruby для этого кажется очень утомительным и сложным для тех, кто работает с NGINX.