H2o: рдлрд┐рд░ рд╕реЗ рд▓рд┐рдЦреЗрдВ... рдХреНрд╖рдорд╛ рдХрд░реЗрдВ!

рдХреЛ рдирд┐рд░реНрдорд┐рдд 4 рдлрд╝рд░ре░ 2016  ┬╖  3рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ  ┬╖  рд╕реНрд░реЛрдд: h2o/h2o

рдРрд╕рд╛ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдХреБрдЫ рдРрд╕реЗ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рд╣реИрдВ рдЬреЛ рдЗрд╕ рдмрд╛рдд рдХреА рддрд▓рд╛рд╢ рдореЗрдВ рд╣реИрдВ рдХрд┐ h2o рдореЗрдВ URL рдХреЛ рдлрд┐рд░ рд╕реЗ рдХреИрд╕реЗ рд▓рд┐рдЦрд╛ рдЬрд╛рдПред mruby рдЗрд╕реЗ рд╕рдВрднрд╡ рдмрдирд╛рддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдпрд╣ рд╕реНрдкрд╖реНрдЯ рдирд╣реАрдВ рд╣реИ рдХрд┐ рдХреИрд╕реЗред рдореИрдВ рдЕрдкрдиреА рдирд╡реАрдирддрдо рдЪреБрдиреМрддреА рдХреЛ рд╢реАрдШреНрд░рддрд╛ рд╕реЗ рд╕рдордЭрд╛рддрд╛ рд╣реВрдВ:

рд╣рдорд╛рд░реЗ рд╕рд░реНрд╡рд░ рдкрд░, рд╣рдореЗрдВ рд╕рд░реНрд╡рд░ рдкрд░ рд╡рд╛рд╕реНрддрд╡рд┐рдХ рдлрд╛рдЗрд▓реЛрдВ рдХреЗ рд▓рд┐рдП рдХреНрд╡реЗрд░реА рд╕реНрдЯреНрд░рд┐рдВрдЧреНрд╕ рдХреЛ рдореИрдк рдХрд░рдирд╛ рд╣реЛрдЧрд╛; рдФрд░ рдЗрдирдореЗрдВ рд░рд┐рдХреНрдд рд╕реНрдерд╛рди рд╢рд╛рдорд┐рд▓ рд╣реЛ рд╕рдХрддреЗ рд╣реИрдВ (рдпрд╛ %20 рдЬрдм URL-рдПрдиреНрдХреЛрдбреЗрдб рд╣реЛ)ред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП:
example.com/search?item=something%20and%somethingelse рдХреЛ рдлрд╝рд╛рдЗрд▓ рдорд┐рд▓рдиреА рдЪрд╛рд╣рд┐рдП
example.com/search/something_and_somethingelse

рдореИрдВрдиреЗ h2o рдФрд░ рд░реИрдХ рд╕реНрдкреЗрдХреНрд╕ рдХреЗ рд▓рд┐рдП mruby рдЙрджрд╛рд╣рд░рдг рдкрдврд╝реЗ, рд▓реЗрдХрд┐рди рдореБрдЭреЗ рд╕рдордЭ рдореЗрдВ рдирд╣реАрдВ рдЖрдпрд╛ рдХрд┐ h2o рдХреЛ рдПрдХ рдЕрд▓рдЧ рдкрде рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдмрддрд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдореБрдЭреЗ рдХреНрдпрд╛ рд▓рд┐рдЦрдирд╛ рд╣реИред рдореИрдВ PATH_INFO рдФрд░ QUERY_STRING рдкрд░реНрдпрд╛рд╡рд░рдг рдЪрд░ рдкрдврд╝ рд╕рдХрддрд╛ рд╣реВрдВ, рд▓реЗрдХрд┐рди рдореИрдВ рдирдП рдорд╛рдиреЛрдВ рдХреЛ h2o рд╕рд░реНрд╡рд░ ("рд╡рд╣рд╛рдВ рдХреЗ рдмрдЬрд╛рдп рдпрд╣рд╛рдВ рджреЗрдЦреЗрдВ") рдкрд░ рдХреИрд╕реЗ рд╕рдВрд╡рд╛рдж рдХрд░реВрдВ?

рд╕рдВрдмрдВрдзрд┐рдд рдиреЛрдЯ рдкрд░, рдореБрдЭреЗ " рд░реИрдХ-рд░реАрд░рд╛рдЗрдЯ " рдирд╛рдордХ рдПрдХ рдкреНрд░рд╕рд┐рджреНрдз рд░рддреНрди рдорд┐рд▓рд╛ред рдФрд░ рдореИрдВ рд╕реЛрдЪ рд░рд╣рд╛ рдерд╛, рдЕрдЧрд░ рдпрд╣ рдореЗрд░реЗ рдкреБрдирд░реНрд▓реЗрдЦрди рдирд┐рдпрдореЛрдВ рдХреЗ рд╕рд╛рде рдореЗрд░реА рдорджрдж рдХрд░ рд╕рдХрддрд╛ рд╣реИ, рдФрд░ рдЗрд╕ рддрд░рд╣ рдХреЗ рдордгрд┐ рдХреЛ рдореЗрд░реЗ рдПрдЪ 2 рдУ рд╕рд░реНрд╡рд░ рдХреЗ рд╕рд╛рде рдХреИрд╕реЗ рдЬреЛрдбрд╝рд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред рдХреНрдпрд╛ рдЖрдкрдХреЗ рдкрд╛рд╕ рдХрд╣реАрдВ рдЙрджрд╛рд╣рд░рдг рд╣реИ?

enhancement help wanted mruby

рд╕рдмрд╕реЗ рдЙрдкрдпреЛрдЧреА рдЯрд┐рдкреНрдкрдгреА

рдореБрдЭреЗ рдпрд╣ рдХрд╣рддреЗ рд╣реБрдП рдЭрдВрдХрд╛рд░ рдХрд░рдирд╛ рд╣реЛрдЧрд╛ рдХрд┐ рдЗрд╕рдХреЗ рд▓рд┐рдП mruby рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ NGINX рд╕реЗ рдЖрдиреЗ рд╡рд╛рд▓реЗ рдХрд┐рд╕реА рд╡реНрдпрдХреНрддрд┐ рдХреЗ рд▓рд┐рдП рдмрд╣реБрдд рдердХрд╛рдК рдФрд░ рдЬрдЯрд┐рд▓ рд▓рдЧрддрд╛ рд╣реИред

рд╕рднреА 3 рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ

рдореИрдВ PATH_INFO рдФрд░ QUERY_STRING рдкрд░реНрдпрд╛рд╡рд░рдг рдЪрд░ рдкрдврд╝ рд╕рдХрддрд╛ рд╣реВрдВ, рд▓реЗрдХрд┐рди рдореИрдВ рдирдП рдорд╛рдиреЛрдВ рдХреЛ h2o рд╕рд░реНрд╡рд░ ("рд╡рд╣рд╛рдВ рдХреЗ рдмрдЬрд╛рдп рдпрд╣рд╛рдВ рджреЗрдЦреЗрдВ") рдкрд░ рдХреИрд╕реЗ рд╕рдВрд╡рд╛рдж рдХрд░реВрдВ?

рдЖрдкрдХреЛ рдЕрдкрдиреА рдХреЙрдиреНрдлрд╝рд┐рдЧрд░реЗрд╢рди рдлрд╝рд╛рдЗрд▓ рдореЗрдВ reproxy: on рд╕реЗрдЯ рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдП рдФрд░ x-reproxy-url рд╣реЗрдбрд░ рд╕реЗрдЯ рдХреЗ рд╕рд╛рде рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рд╡рд╛рдкрд╕ рдХрд░рдиреА рдЪрд╛рд╣рд┐рдПред рдпрд╣ рд╣реЗрдбрд░ рдХреЗ рд╕рд╛рде рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдпреВрдЖрд░рдПрд▓ рдХреА рд╕рд╛рдордЧреНрд░реА рдХреЛ рд╡рд╛рдкрд╕ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд░реЗрдкреНрд░реЛрдХреНрд╕реА рд╣реИрдВрдбрд▓рд░ рдХреЛ рдирд┐рд░реНрджреЗрд╢ рджреЗрддрд╛ рд╣реИред
рдпрд╣ рднреА рджреЗрдЦреЗрдВ: https://h2o.examp1e.net/configure/mruby_directives.html#delegating -request

рд╕рдВрдмрдВрдзрд┐рдд рдиреЛрдЯ рдкрд░, рдореБрдЭреЗ "рд░реИрдХ-рд░реАрд░рд╛рдЗрдЯ" рдирд╛рдордХ рдПрдХ рдкреНрд░рд╕рд┐рджреНрдз рд░рддреНрди рдорд┐рд▓рд╛ред рдФрд░ рдореИрдВ рд╕реЛрдЪ рд░рд╣рд╛ рдерд╛, рдЕрдЧрд░ рдпрд╣ рдореЗрд░реЗ рдкреБрдирд░реНрд▓реЗрдЦрди рдирд┐рдпрдореЛрдВ рдХреЗ рд╕рд╛рде рдореЗрд░реА рдорджрдж рдХрд░ рд╕рдХрддрд╛ рд╣реИ, рдФрд░ рдЗрд╕ рддрд░рд╣ рдХреЗ рдордгрд┐ рдХреЛ рдореЗрд░реЗ рдПрдЪ 2 рдУ рд╕рд░реНрд╡рд░ рдХреЗ рд╕рд╛рде рдХреИрд╕реЗ рдЬреЛрдбрд╝рд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред рдХреНрдпрд╛ рдЖрдкрдХреЗ рдкрд╛рд╕ рдХрд╣реАрдВ рдЙрджрд╛рд╣рд░рдг рд╣реИ?

рд░реИрдХ-рдкреБрдирд░реНрд▓реЗрдЦрди рд░реИрдХ рджреНрд╡рд╛рд░рд╛ рдкреНрд░рджрд╛рди рдХрд┐рдП рдЧрдП _рдкреБрд╕реНрддрдХрд╛рд▓рдпреЛрдВ_ рдкрд░ рдирд┐рд░реНрднрд░ рдХрд░рддрд╛ рд╣реИ, рдФрд░ рдореБрдЭреЗ рдбрд░ рд╣реИ рдХрд┐ рдЖрдк рдЗрд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рдирд╣реАрдВ рдХрд░ рд╕рдХрддреЗ рдЬреИрд╕рд╛ рдХрд┐ рдореГрдмреА рд╕реЗ рд╣реИ (рд╣рд╛рд▓рд╛рдВрдХрд┐ рдЖрдИрдПрдордУ рдЗрд╕реЗ рдореГрдмреА рдореЗрдВ рдкреЛрд░реНрдЯ рдХрд░рдирд╛ рдХрдард┐рди рдирд╣реАрдВ рд╣реЛрдЧрд╛)ред

рдореИрдВ рд╕рдордЭрддрд╛ рд╣реВрдВ рдХрд┐ рдорд░реНрдмреА рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдирд┐рдпрдореЛрдВ рдХреЛ рд▓рд┐рдЦрдиреЗ рдХреЗ рдмрдЬрд╛рдп рд░реАрдбрд╛рдпрд░реЗрдХреНрдЯ рдХреЛ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдХрд░рдиреЗ рдХреЗ рдЕрдзрд┐рдХ рдШреЛрд╖рдгрд╛рддреНрдордХ рддрд░реАрдХреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ; рдпрд╣ рдмрд╣реБрдд рдЕрдЪреНрдЫрд╛ рд╣реЛрдЧрд╛ рдЕрдЧрд░ рдХреЛрдИ рд░реИрдХ-рд░реАрд░рд╛рдЗрдЯ рдпрд╛ рдХреБрдЫ рдЗрд╕реА рддрд░рд╣ рдХреЗ рдмрдВрджрд░рдЧрд╛рд╣ рдХреЗ рд╕рд╛рде рдЖ рд╕рдХрддрд╛ рд╣реИред

рдЖрдкрдХреЛ рдмрд╣реБрдд - рдмрд╣реБрдд рдзрдиреНрдпрд╡рд╛рдж! рдЕрдм рдореИрдВ рд╕рдордЭ рдЧрдпрд╛ред

рд░рд┐рдХреЙрд░реНрдб рдХреЗ рд▓рд┐рдП - рдФрд░ рд╣рд░ рдХреЛрдИ рдХреБрдЫ рдЗрд╕реА рддрд░рд╣ рдХреА рддрд▓рд╛рд╢ рдореЗрдВ рд╣реИ: 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 рд░реЗрдЯрд┐рдВрдЧреНрд╕