h2o์์ URL์ ๋ค์ ์์ฑํ๋ ๋ฐฉ๋ฒ์ ์ฐพ๋ ์ฌ์ฉ์๊ฐ ๊ฝค์๋ ๊ฒ ๊ฐ์ต๋๋ค. mruby๋ ๊ฐ๋ฅํ์ง๋ง ๋ฐฉ๋ฒ์ ๋ช ํํ์ง ์์ต๋๋ค. ๋๋ ๋์ ์ต๊ทผ ๋์ ์ ๋น ๋ฅด๊ฒ ์ค๋ช ํ๋ค.
์๋ฒ์์ ์ฟผ๋ฆฌ ๋ฌธ์์ด์ ์๋ฒ์ ์ค์ ํ์ผ์ ๋งคํํด์ผํฉ๋๋ค. ์ฌ๊ธฐ์๋ ๊ณต๋ฐฑ (๋๋ URL ์ธ์ฝ๋ฉ ๋ ๊ฒฝ์ฐ % 20)์ด ํฌํจ๋ ์ ์์ต๋๋ค. ์๋ฅผ ๋ค๋ฉด :
example.com/search?item=something%20and%somethingelse๊ฐ ํ์ผ์ ๊ฐ์ ธ์์ผํฉ๋๋ค.
example.com/search/something_and_somethingelse
h2o ๋ฐ Rack specs์ ๋ํ mruby ์์ ๋ฅผ ์ฝ์์ง๋ง h2o์๊ฒ ๋ค๋ฅธ ๊ฒฝ๋ก๋ฅผ ์ฌ์ฉํ๋๋ก ์ง์ํ๊ธฐ ์ํด ์์ฑํด์ผํ๋ ๋ด์ฉ์ ์ ์ดํดํ์ง ๋ชปํฉ๋๋ค. PATH_INFO ๋ฐ QUERY_STRING ํ๊ฒฝ ๋ณ์๋ฅผ ์ฝ์ ์ ์์ง๋ง ์ ๊ฐ์ h2o ์๋ฒ์ ๋ค์ ์ ๋ฌํ๋ ค๋ฉด ์ด๋ป๊ฒํด์ผํฉ๋๊น ( "๊ฑฐ๊ธฐ ๋์ ์ฌ๊ธฐ๋ฅผ๋ณด์ญ์์ค")?
๊ด๋ จ ๋ฉ๋ชจ์์ " rack-rewrite "๋ผ๊ณ ํ๋ ์ ์๋ ค์ง ๋ณด์์ ๋ฐ๊ฒฌํ์ต๋๋ค. ๊ทธ๋ฆฌ๊ณ ์ด๊ฒ์ด ๋ด ์ฌ ์์ฑ ๊ท์น์ ๋์์ด ๋ ์ ์๋์ง, ๊ทธ๋ฆฌ๊ณ ๊ทธ๋ฌํ gem์ด ๋ด h2o ์๋ฒ์ ์ด๋ป๊ฒ ๊ฒฐํฉ ๋ ์ ์๋์ง ๊ถ๊ธํฉ๋๋ค. ์ด๋๊ฐ์ ์๊ฐ ์์ต๋๊น?
PATH_INFO ๋ฐ QUERY_STRING ํ๊ฒฝ ๋ณ์๋ฅผ ์ฝ์ ์ ์์ง๋ง ์ ๊ฐ์ h2o ์๋ฒ์ ๋ค์ ์ ๋ฌํ๋ ค๋ฉด ์ด๋ป๊ฒํด์ผํฉ๋๊น ( "๊ฑฐ๊ธฐ ๋์ ์ฌ๊ธฐ๋ฅผ๋ณด์ญ์์ค")?
๊ตฌ์ฑ ํ์ผ์์ reproxy: on
๋ฅผ ์ค์ ํ๊ณ x-reproxy-url
ํค๋ ์ธํธ๊ฐ์๋ ์๋ต์ ๋ฐํํด์ผํฉ๋๋ค. ์ด๋ reproxy ํธ๋ค๋ฌ๊ฐ ํค๋๋ก ์ง์ ๋ URL์ ๋ด์ฉ์ ๋ฐํํ๋๋ก ์ง์ํฉ๋๋ค.
์ฐธ์กฐ : https://h2o.examp1e.net/configure/mruby_directives.html#delegating -request
๊ด๋ จ ๋ฉ๋ชจ์์ "rack-rewrite"๋ผ๋ ์ ์๋ ค์ง ๋ณด์์ ๋ฐ๊ฒฌํ์ต๋๋ค. ๊ทธ๋ฆฌ๊ณ ์ด๊ฒ์ด ๋ด ์ฌ ์์ฑ ๊ท์น์ ๋์์ด ๋ ์ ์๋์ง, ๊ทธ๋ฆฌ๊ณ ๊ทธ๋ฌํ gem์ด ๋ด h2o ์๋ฒ์ ์ด๋ป๊ฒ ๊ฒฐํฉ ๋ ์ ์๋์ง ๊ถ๊ธํฉ๋๋ค. ์ด๋๊ฐ์ ์๊ฐ ์์ต๋๊น?
Rack-rewrite๋ Rack์์ ์ ๊ณตํ๋ _libraries_์ ์์กดํ๋ฉฐ mruby์์ ๊ทธ๋๋ก ์ฌ์ฉํ ์ ์์ต๋๋ค (IMO๊ฐ mruby๋ก ํฌํ ํ๋ ๊ฒ์ ์ด๋ ต์ง ์์ต๋๋ค).
mruby๋ฅผ ์ฌ์ฉํ์ฌ ๊ท์น์ ์์ฑํ๋ ๊ฒ๋ณด๋ค ๋ฆฌ๋๋ ์ ์ ์ง์ ํ๋๋ณด๋ค ์ ์ธ์ ์ธ ๋ฐฉ๋ฒ์ด ํ์ํ๋ค๋ ๊ฒ์ ์๊ณ ์์ต๋๋ค. ๋๊ตฐ๊ฐ๊ฐ ๋ ์ฌ ์์ฑ ํฌํธ ๋ ๋น์ทํ ๊ฒ์ ์๊ฐ ํด๋ผ ์ ์๋ค๋ฉด ์ข์ ๊ฒ์ ๋๋ค.
์ ๋ง ๊ณ ๋ง์ต๋๋ค! ์ด์ ์์์ต๋๋ค.
๊ธฐ๋ก์ ์ํด-๊ทธ๋ฆฌ๊ณ ๋น์ทํ ๊ฒ์ ์ฐพ๋ ๋ชจ๋ ์ฌ๋ : h2o.conf์ ๋ค์ ๋ถ๋ถ์ / test / ์๋์ ๋ชจ๋ URL์์ ๋จ์ผ ๋น ๊ณต๊ฐ์ ๋ฐ์ค๋ก ๋ฐ๊ฟ๋๋ค.
์ : 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์์ ์ค๋ ๋๊ตฐ๊ฐ์๊ฒ ๋งค์ฐ ์ง๋ฃจํ๊ณ ๋ณต์กํด ๋ณด์ธ๋ค๊ณ ๋งํด์ผํฉ๋๋ค.