h2oでURLを書き換える方法を探しているユーザーはかなり多いようです。 mrubyはそれを可能にしますが、その方法は明確ではありません。 私は私の最新の課題を簡単に説明します:
サーバーでは、クエリ文字列をサーバー上の実際のファイルにマップする必要があります。 これらには空白スペース(またはURLエンコードされている場合は%20)が含まれる場合があります。 例えば:
example.com/search?item=something%20and%somethingelseがファイルを取得する必要があります
example.com/search/something_and_somethingelse
h2oのmrubyの例とRackの仕様を読みましたが、 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サーバーとどのように組み合わせることができるのか疑問に思いました。 どこかに例がありますか?
Rack-rewriteはRackが提供する_libraries_に依存しており、mrubyからそのまま使用することはできません(IMOがmrubyに移植するのは難しくありませんが)。
mrubyを使用してルールを書き留めるのではなく、リダイレクトを指定するより宣言的な方法が必要であることを理解しています。 誰かがラックリライトまたは同様のもののポートを思い付くことができれば素晴らしいでしょう。
どうもありがとうございます! 今、私はそれを手に入れました。
記録のために-そして似たようなものを探しているすべての人:h2o.confの次の部分は、/ test /の下のすべてのURLで単一の空のスペースをアンダースコアに置き換えます
例: https :
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から来た人にとっては非常に退屈で複雑に思えると言って、チャイムを鳴らさなければなりません。