Ruby
 Computer >> コンピューター >  >> プログラミング >> Ruby

HTTPヘッダーがnginxからRubyアプリに渡される方法

最近では、ほとんどすべてのWeb開発がフレームワークで行われています。 Rails、Sinatra、Lotusのいずれを使用する場合でも、Cookieやその他のヘッダーがnginxやapacheからアプリケーションサーバーやアプリにどのように渡されるかを考える必要はありません。彼らはただそうします。

この旅をもう少し詳しく見ていきます。ヘッダーのストーリーには、ウェブの歴史に関する興味深い情報がたくさん含まれていることがわかったからです。

とにかくHTTPヘッダーとは何ですか?

Webブラウザがrequesnginxtを作成するたびに、HTTPヘッダーと呼ばれるものを送信します。 Cookie、ユーザーエージェントに関する情報、キャッシュ情報など、非常に便利な情報が含まれています。

ブラウザの開発ツールでリクエストを確認すると、送信されているヘッダーを確認できます。これが例です。ご覧のとおり、ヘッダーは魔法のようなものではありません。特定の方法でフォーマットされたテキストです。

HTTPヘッダーがnginxからRubyアプリに渡される方法

ヘッダーがアプリに渡されない方法

ラックアプリを作成したことがある場合は、おそらくenvを見たことがあるでしょう。 ハッシュ。アプリの環境変数が含まれています。内部を見ると、通常のシステム環境変数に加えて、すべてのリクエストヘッダーも含まれていることがわかります。

# config.ru
run lambda { |env| [200, {"Content-Type" => "text/plain"}, [env.inspect]] }

# Outputs:
# { "HTTP_HOST"=>"localhost:9000", "HTTP_CONNECTION"=>"keep-alive", "HTTP_PRAGMA"=>"no-cache", "HTTP_CACHE_CONTROL"=>"no-cache", "HTTP_ACCEPT"=>"text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8", "HTTP_UPGRADE_INSECURE_REQUESTS"=>"1", "HTTP_USER_AGENT"=>"Mozilla/5.0 (Macintosh; Intel Mac OS X 10_11_2) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/47.0.2526.106 Safari/537.36", ... }

これはありません nginxがヘッダーをアプリに渡す方法。 :)

アプリケーションサーバー

現在、ほとんどのRuby Webアプリは、Unicornなどのアプリケーションサーバーで実行されます。アプリサーバーはnginxによって生成されないため、nginxは環境変数を設定できません。

では、ヘッダーはnginxからユニコーンにどのように移動しますか?単純。 nginxがリクエストをアプリサーバーに転送すると、リクエスト全体(ヘッダーとすべて)が送信されます。

これを実証するために、nginxがSTDOUTに送信するすべてのものをダンプする単純なアプリケーションサーバーを構築しました。

require "socket"

# Create the socket and "save it" to the file system
server = UNIXServer.new('/tmp/socktest.sock')

# Wait until for a connection (by nginx)
socket = server.accept

# Read everything from the socket
while line = socket.readline
  puts line.inspect
end

socket.close

Unicornではなくこのサーバーに接続するようにnginxを構成すると、アプリサーバーに送信されている情報が正確に表示されます。通常のHTTPリクエストだけです。ヘッダーとすべて。

HTTPヘッダーがnginxからRubyアプリに渡される方法

単純なアップストリームアプリサーバーを作成する方法の詳細については、UNIXソケットに関する私の投稿を確認してください。

なぜ環境変数を気にするのですか?

1993年に、NSCAは「CommonGatewayInterface」または略してCGIと呼ばれるものの仕様を公開しました。

HTTPヘッダーがnginxからRubyアプリに渡される方法

これは、Apacheのようなサーバーがディスク上で任意のプログラムを実行して動的なWebページを生成する方法でした。ユーザーはページを要求し、Apacheは文字通りシェルアウトしてプログラムを実行し、結果を生成します。 Apacheはアプリを直接生成するため、環境変数を設定できます。

CGI標準では、HTTPヘッダーを環境変数として渡すことが指定されています。また、既存の環境変数との名前の衝突を避けるために、名前の前に「HTTP_」を付ける必要があることを指定しています。

したがって、次のような一連の環境変数ができあがります。

 HTTP_ACCEPT="text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8"
 HTTP_ACCEPT_CHARSET="ISO-8859-1,utf-8;q=0.7,*;q=0.7"
 HTTP_ACCEPT_ENCODING="gzip, deflate"
 HTTP_ACCEPT_LANGUAGE="en-us,en;q=0.5"
 HTTP_CONNECTION="keep-alive"
 HTTP_HOST="example.com"
 HTTP_USER_AGENT="Mozilla/5.0 (Windows NT 6.1; WOW64; rv:5.0) Gecko/20100101 Firefox/5.0"

現在、新しい開発にCGIを使用する人はほとんどいませんが、HTTPヘッダーが環境変数として保存されているのを見るのは、偽の環境変数である場合もありますが、それでも非常に一般的です。

アプリサーバーがそれを偽造する方法

アプリケーションサーバーは、生のHTTPリクエストからヘッダーを解析します。では、彼らはどのようにして環境に入るのでしょうか?ええと、アプリサーバーはそれらをそこに置きます。

webrickを少し掘り下げて、喫煙銃を見つけることができました:


      self.each{|key, val|
        next if /^content-type$/i =~ key
        next if /^content-length$/i =~ key
        name = "HTTP_" + key
        name.gsub!(/-/o, "_")
        name.upcase!
        meta[name] = val
      }

最終的に、これらの「偽の」環境変数は他のより現実的な環境変数とマージされ、ラックアプリに渡されてRailsに渡され、環境ハッシュから戻されます。 :)


  1. macOS から SearchMine を削除する方法

    それで、あなたは SearchMine マルウェアに悩まされていますか?あなたは正しい場所に来ました。ここでは、この厄介なマルウェアを Mac から削除し、Safari、Chrome、および Firefox が rougeSearchmine Web サイトにリダイレクトされないようにする方法を説明します. 10 代の若者は、常に親や年長者と対立しています。彼らは、してはいけないと言われていることとは正反対のことをします。何かをダウンロードするときに注意するように頼むと、彼らは耳を傾けません.特に無料という言葉がダウンロードに付いている場合、10 代だけでなく、注意事項を見落としています。無

  2. コンピュータから iPhone のお気に入りの曲を取得する方法

    お気に入りのトラックをコンピュータから iPhone に転送するのは少し難しいかもしれませんが、不可能ではありません。 Android とは異なり、iPhone をケーブルで接続するだけで音楽やビデオを直接 iPhone に転送することはできません。しかし、それはあなたの iPhone で同じ音楽を購入する必要があるという意味ではありません。コンピュータまたは Mac から iPhone に音楽を転送する簡単な方法があります。 次の手順に従って、コンピューターから iPhone に音楽を転送できます。 iTunes のダウンロードから始めて、Apple の公式 Web サイトから最新バージョ