H2o: 書き直して...もう一度、ごめんなさい!

作成日 2016年02月04日  ·  3コメント  ·  ソース: h2o/h2o

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サーバーとどのように組み合わせることができるのか疑問に思いました。 どこかに例がありますか?

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サーバーとどのように組み合わせることができるのか疑問に思いました。 どこかに例がありますか?

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から来た人にとっては非常に退屈で複雑に思えると言って、チャイムを鳴らさなければなりません。

このページは役に立ちましたか?
0 / 5 - 0 評価

関連する問題

Ys88 picture Ys88  ·  5コメント

wujunjenny picture wujunjenny  ·  5コメント

kazuho picture kazuho  ·  7コメント

voiddeveloper picture voiddeveloper  ·  6コメント

Ys88 picture Ys88  ·  5コメント