2012-09-09 149 views
1

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

有人可以告诉我如何找出请求被调用的域名?

+1

为什么不使用Nginx或Apache?在这里重新发明车轮。 –

+3

您可以查看请求的“主机”标题。 – taro

+1

安德鲁:不是重塑,更像是“建立我自己的车轮”:) – JAkk

回答

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]) 

线程块中。