1
我只是用TCPServer Gem建立我自己的HTTP-Webserver。現在我的服務器使用相同的(本地主機)IP和端口(80)運行。但是如果我在一臺服務器上有多個域並希望在本地主機ip上使用服務器,但是爲每個域打印不同的數據呢?虛擬主機與TCPServer
有人可以告訴我如何找出請求被調用的域名?
我只是用TCPServer Gem建立我自己的HTTP-Webserver。現在我的服務器使用相同的(本地主機)IP和端口(80)運行。但是如果我在一臺服務器上有多個域並希望在本地主機ip上使用服務器,但是爲每個域打印不同的數據呢?虛擬主機與TCPServer
有人可以告訴我如何找出請求被調用的域名?
我相信你的東西創建你的服務器一樣
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])
線程塊中。
爲什麼不使用Nginx或Apache?在這裏重新發明車輪。 –
您可以查看請求的「主機」標題。 – taro
安德魯:不是重塑,更像是「建立我自己的車輪」:) – JAkk