1

TCPServer Gem を使用して独自の HTTP Web サーバーを構築するだけです。これで、サーバーが同じ (localhost) IP とポート (80) で実行されます。しかし、1 つのサーバーに複数のドメインがあり、サーバーを localhost IP で使用したいが、ドメインごとに異なるデータを出力したい場合はどうすればよいでしょうか?

リクエストがどのドメインから呼び出されたかを調べる方法を誰か教えてもらえますか?

4

1 に答える 1

0

次のようなものでサーバーを作成したと思います

require 'socket'

server = TCPServer.new 80
loop do
  Thread.start(server.accept) do |client|
    ...
  end
end

client.recvmsgこのコード内で、配列である をチェックできます。この配列の最初の要素にはclient.recvmsg[0]、サーバーに対して行われたリクエストのヘッダーが含まれています。何かのようなもの:

GET /something HTTP/1.1
Host: localhost:4321
Connection: keep-alive
Cache-Control: max-age=0
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8
Upgrade-Insecure-Requests: 1
User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/50.0.2661.102 Safari/537.36
DNT: 1
Accept-Encoding: gzip, deflate, sdch
Accept-Language: pt-BR,pt;q=0.8,en-US;q=0.6,en;q=0.4,fr-CA;q=0.2,fr;q=0.2

ご覧のとおり、Host ヘッダーは 2 行目にあります。あとは隔離するだけです。私はこのようにしました:

def get_host(message)
  lines = message.split("\n")
  lines.shift
  host_name = ""
  lines.each{ |line|
    key_value = line.split(': ')
    host_name = key_value[1].strip if key_value[0].strip == "Host"
  }
  host_name
end

次のように呼び出すと、これにより Host ヘッダーが得られます

host_header = get_host(client.recvmsg[0])

スレッドブロック内。

于 2016-06-14T23:21:39.480 に答える