H2o: Перепиши ... еще раз извините!

Созданный на 4 февр. 2016  ·  3Комментарии  ·  Источник: h2o/h2o

Кажется, довольно много пользователей ищут, как переписать 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. У вас есть где-нибудь пример?

enhancement help wanted mruby

Самый полезный комментарий

Я должен сказать, что использование mruby для этого кажется очень утомительным и сложным для тех, кто работает с NGINX.

Все 3 Комментарий

Я могу читать переменные среды 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.

Была ли эта страница полезной?
0 / 5 - 0 рейтинги

Смежные вопросы

utrenkner picture utrenkner  ·  8Комментарии

daniel-lucio picture daniel-lucio  ·  5Комментарии

chenbd picture chenbd  ·  3Комментарии

utrenkner picture utrenkner  ·  7Комментарии

Ys88 picture Ys88  ·  5Комментарии