聽說一個IP可以綁定多個域名,那麼服務端是怎麼實現的?

如果我以IP訪問伺服器,伺服器怎麼才能知道我想上的是哪個網站?


首先,一個IP綁定多個域名是很常見的事情,租用的虛擬主機大多數都是多個主機共享同一個IP,區分具體訪問的是哪個主機要從兩個方面實現:

1、客戶端如何區別不同網站

客戶端在請求時,會在HTTP請求的時候包含要請求的具體主機名稱,比如訪問Google的請求通過抓包分析內容是這樣的:

GET / HTTP/1.1
Host: www.google.com

整個請求會被發送到伺服器上,其中有Host欄位標識你要請求的網站域名是什麼,即使訪問的是同一個IP地址,由於Host欄位不同,所以伺服器軟體有辦法區分具體訪問的是哪個網站。

關於Host欄位的具體定義,可以閱讀RFC-2616的第14.23節:http://www.rfc-editor.org/rfc/rfc2616.txt

以下是節選(注意加粗的部分):

14.23 Host

The Host request-header field specifies the Internet host and port
number of the resource being requested, as obtained from the original
URI given by the user or referring resource (generally an HTTP URL,
as described in section 3.2.2). The Host field value MUST represent
the naming authority of the origin server or gateway given by the
original URL. This allows the origin server or gateway to
differentiate between internally-ambiguous URLs, such as the root "/"
URL of a server for multiple host names on a single IP address.

另外,RFC-2616並非HTTP協議的最新規範,具體的規範請參考RFC-2616的描述鏈接:Information on RFC 2616

2、伺服器端如何配置

如果伺服器使用Apache,那麼在Apache的配置文件中加入VirtualHost即可新增虛擬主機:

&
ServerAdmin admin@admin
DocumentRoot "D:/website1"
ServerName http://myhost1.com

DirectoryIndex index.php
&

&
ServerAdmin admin@admin
DocumentRoot "D:/website2"
ServerName http://myhost2.com

DirectoryIndex index.php
&

以上就定義了兩個域名http://myhost1.com和http://myhost2.com,分別在不同的根目錄,通過這樣的配置Apache如果收到http://myhost1.com的請求,那麼就到d:/website1里尋找對應的頁面,如果是http://myhost2.com的請求,那麼就到d:/website2里尋找對應的頁面。

通常Apache還有一個默認網站,這個網站是可以使用IP地址訪問的,如果將這個網站設置為無效,那麼這個主機就無法通過IP地址直接訪問HTTP資源。

對於IIS來說,IIS能使用同一個IP綁定多個站點,具體可以參考下圖:

在默認網站-&>屬性-&>網站-&>高級中,添加不同的域名即可。因為我的IIS版本較低,本身無法支持綁定多個網站,高版本的IIS中,可以配置多個網站,每個網站綁定不同的域名,即可實現訪問時的區分。

如果伺服器沒設置默認網站,那麼IP地址也無法直接訪問主機。

所以,如果你直接通過IP地址訪問網站,會遇到兩種情況:
1、伺服器設置了默認網站,或者使用IP作為主機名去匹配請求的Host欄位,那麼你通過IP訪問的就是這個網站;
2、伺服器沒有設置默認網站,或者默認網站被禁止,那麼你通過IP無法打開任何東,通常遇到的是404錯誤(找不到頁面),在我使用過的幾個虛擬主機服務商那,遇到的都是類似的錯誤。

另外,不管是IIS或者Apache或者其它類型的網站伺服器軟體,不僅僅支持多域名,也支持多IP,也就是一個伺服器同時有多個域名和多個IP,互相之間是互不干擾的。


一個IP可以綁定多個域名,但是一個域名只能指向一個IP。

用IP訪問網站直接訪問伺服器,不需要通過DNS更不需要解析域名。

如果一個伺服器里有多個網站可以用子目錄,或不同的埠實現。


依靠HTTP請求中的Host欄位。

如果客戶端給虛擬主機發送的Host不含域名,那麼會收到403 Forbidden錯誤。取決於伺服器的配置,也可以做其他非標準錯誤處理。


如果伺服器上沒有開啟未綁定任何域名的默認站點,那你用IP訪問打不開任何站點。


http有一個header,是host
nginx伺服器會根據這個host 轉發到不同的機器或埠


所有 請求 其實最後都會落實到埠號上,所以沒有根據ip查域名這回事,只有那句域名查ip和埠這回事。
你不帶埠號直接用ip訪問,默認訪問的是伺服器的80埠,這個埠上跑了什麼http服務,就是指定到什麼服務。
如果要指定到其他服務,指定不同的埠即可。
多個域名綁定到一個ip大多數情況下也是通過nginx轉發到不同的埠上。

還有種方案是都映射到80埠,然後在程序里根據域名不同來做不同的處理,不過一般不會這樣做。


你請求的時候,http頭裡有host


想必題主指的是web伺服器吧,對於同一個WEB伺服器下,區分不同的網站一般有三種形式:主機頭、埠號、ip地址。
既然是同一個ip綁定多個域名的情況,那必然是通過主機頭來進行區分。
這(舉個例子:
有A,B兩個網站,
A站的域名是http://aaa.com,
B站的域名是http://bbb.com,
兩個域名同時解析到192.168.1.101的地址上。

那麼在配置web伺服器的時候,
新建第一個網站
主機頭為webA,
ip為192.168.1.101,
綁定域名為http://aaa.com

新建第二個網站
主機頭為webB,
ip為192.168.1.101,
綁定域名為http://bbb.com,

當用戶訪問http://aaa.com時,
首先由dns解析出ip為192.168.1.101,
然後訪問這台伺服器http請求,
伺服器根據你要訪問的域名判斷出是webA這個網站,就會響應對應的信息。

---------------------------------------
如果直接用ip地址請求呢?
web伺服器下有一個默認網站,默認網站里放的是哪個網站,用ip請求響應的就是哪個網站的默認頁面。


只用過Apache實驗過這個問題。

在Apache里,如果沒有單獨綁定基於IP的虛擬主機,則直接訪問IP的話,他會用配置文件里讀取到的第一個虛擬主機來響應。


一個ip綁定多個域名,可以在程序中區分當前的host,最經典的是nginx的配置轉發了,可以參看鏈接:Nginx對同IP、同埠、不同域名的轉發,如果是直接用ip訪問的話,默認應該是訪問的該伺服器上80埠的站點或應用


簡單說來。。網站的區分使用IP不是用域名。
你輸入不同的域名都是訪問那個被綁定的IP。


看看HTTP協議。
可以在header里的HOST指定,IIS等web server綁定HOST就可以了


當然可以了,你只要創建多個虛擬機就能可以一個ip多個域名訪問


推薦閱讀:

服務端是如何主動推送信息到客戶端的?
用 thrift 或 gRPC 之類的框架做 app 和伺服器的通信合適嗎?
目前主流的伺服器有哪些?軟體和硬體?
公司在機房有幾台伺服器,進機房前應該做哪些防護措施呢?輻射會不會很大?

TAG:互聯網 | 域名 | 伺服器 | 計算機網路 | IP地址 |