使用TCPServer的VirtualHost

时间:2012-09-09 17:24:23

标签: ruby http tcpserver

我只是使用TCPServer Gem构建自己的HTTP-Webserver。现在我让服务器运行相同的(localhost)IP和端口(80)。但是如果我在一台服务器上有多个域并希望服务器在localhost ip上使用,但是为每个域打印不同的数据呢?

有人可以告诉我如何找出请求所在的域名吗?

1 个答案:

答案 0 :(得分: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标头位于第二行。那只是隔离它的问题。我是这样做的:

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_header = get_host(client.recvmsg[0])

在Thread块中。