![伺服器只保存一個網站嗎?](https://rvso.com/image/1497112/%E4%BC%BA%E6%9C%8D%E5%99%A8%E5%8F%AA%E4%BF%9D%E5%AD%98%E4%B8%80%E5%80%8B%E7%B6%B2%E7%AB%99%E5%97%8E%EF%BC%9F.png)
據我了解,DNS將網域名稱與儲存網站的伺服器的IP位址連結起來,這是否意味著每台伺服器只能容納一個網站?如果沒有,如果同一台伺服器上有很多網站,呼叫伺服器的IP位址如何知道我想要哪個網站?
答案1
基本上:瀏覽器在 HTTP 請求中包含域名,因此網頁伺服器知道請求的是哪個域並且可以做出相應的回應。
HTTP 請求
以下是典型 HTTP 請求的發生方式:
使用者提供一個 URL,格式為
http://host:port/path
。瀏覽器提取 URL 的主機(網域)部分,並在必要時將其轉換為 IP 位址,此過程稱為名稱解析。這種轉換可以透過 DNS 進行,但並非必須如此(例如,
hosts
常見作業系統上的本機檔案繞過 DNS)。瀏覽器開啟到該 IP 位址上指定連接埠的 TCP 連接,或預設為連接埠 80。
瀏覽器會傳送 HTTP 請求。對於 HTTP/1.1,它看起來像這樣:
GET /path HTTP/1.1 Host: example.com
(該
Host
標頭是標準的,並且是 HTTP/1.1 中必需的。HTTP/1.0 規範中未指定該標頭,但有些伺服器還是支援它。)
從這裡開始,網頁伺服器可以使用幾個資訊來決定回應應該是什麼。請注意,單一 Web 伺服器可以綁定到多個 IP 位址。
- 來自 TCP 套接字請求的 IP 位址
- 客戶端的 IP 位址也是可用的,但這很少使用 - 有時用於阻止/過濾
- 來自 TCP 套接字的請求端口
- 請求的主機名,
Host
由瀏覽器在 HTTP 請求的標頭中指定。 - 請求的路徑
- 任何其他標頭(cookie 等)
正如您似乎已經注意到的那樣,當今最常見的共享託管設定將多個網站放在一個 IP 位址:連接埠組合上,僅Host
用於區分網站。
這被稱為基於名稱的虛擬主機在 Apache 領域,而 Nginx 稱它們為伺服器區塊中的伺服器名稱並且 IIS 更喜歡虛擬伺服器。
HTTPS 怎麼樣?
HTTPS 有點不同。在建立 TCP 連線之前一切都是相同的,但之後必須建立加密的 TLS 隧道。目標是不洩露有關請求的任何資訊。
為了驗證伺服器是否確實擁有該網域,伺服器必須傳送由受信任的第三方簽署的憑證。然後,瀏覽器會將此憑證與其要求的網域進行比較。
這提出了一個問題。如果伺服器需要在收到 HTTP 請求之前執行此操作,那麼伺服器如何知道要傳送哪個主機(網站)的憑證?
傳統上,這是透過為每個需要 HTTPS 的網站提供專用 IP 位址(或連接埠)來解決的。顯然,當我們開始用完 IPv4 位址時,這就會出現問題。
進入神經網路研究所(伺服器名稱指示)。瀏覽器現在在 TLS 協商期間傳遞主機名,因此伺服器可以儘早獲得此資訊以傳送正確的憑證。在伺服器端,配置與 HTTP 虛擬主機的配置方式非常相似。
缺點是主機名稱現在在加密之前以純文字形式傳遞,並且本質上是洩漏的資訊。考慮到主機名稱通常會在 DNS 查詢中公開,這通常被認為是可接受的權衡。
如果您僅透過 IP 位址請求網站怎麼辦?
當伺服器不知道您要求的特定主機時,它會做什麼取決於伺服器的實作和配置。通常,指定一個「預設」、「包羅萬象」或「後備」站點,它將為所有未明確指定主機的請求提供回應。
此預設站點可以是其自己的獨立站點(通常顯示錯誤訊息),也可以是伺服器上的任何其他站點,具體取決於伺服器管理員的首選項。
答案2
我對非技術人員有這樣的解釋。
傑克、吉兒和喬住在宿舍,他們沒有手機。
在電話簿中,它們都以相同的號碼列出。 (一個記錄)
你撥打號碼,有人接電話;你說“我想和吉爾通話”,然後讓她接通。
電話簿中可能沒有 A 記錄(電話號碼/IP 位址),而只是顯示“X 宿舍”,那麼您必須進一步查找 X 宿舍的號碼。
如果吉爾沒空,您可能會得到
- 第404章 吉爾不在
- 410 吉爾死了。
- 第301章 吉爾搬去和彼得住在一起
第302章 吉爾正在拜訪彼得,請打電話給他
400 我聽不懂你的話。
- 第401章 你是誰?密碼是什麼?或 晚上 10 點後我們不允許男性來電
- 402 需要付款(你確定吉爾是她的真名嗎;-))
- 403 不,這不是正確的密碼。
- 第418章 吉爾是個茶壺:-)
- 429 吉爾無法再接聽任何電話。
451 您違反了限制令。
500 我們的電話系統壞了。
答案3
據我了解,DNS將網域名稱與儲存網站的伺服器的IP位址連結起來,這是否意味著每台伺服器只能容納一個網站?
首先,您需要了解這裡有許多不同的概念。
- 網站,形成一個連貫整體的一組網頁。
- IP 位址,網際網路協定用作流量來源或目的地的數位位址(IPv4 為 32 位,IPv6 為 128 位元)。
- 伺服器,其工作是服務客戶端請求的機器。
- 主機名,用於在 DNS 中識別電腦的名稱(例如“www.example.com”或“en.wikipedia.org”)
這些事物之間不存在一對一的關係。一台伺服器可以有多個IP位址;多個主機名稱可以指向一個IP位址;一個主機名稱可以指向多個IP位址。多個網站可以位於同一主機名稱下。一個網站可以分佈在多個主機名稱上。
如果沒有,如果同一台伺服器上有很多網站,呼叫伺服器的IP位址如何知道我想要哪個網站?
在過去(HTTP 1.0 及之前),伺服器想要以不同方式處理的每個主機名稱都必須有自己的 IP 位址。這實在是太浪費了。
HTTP 1.1 新增了Host
「標頭」作為HTTP 請求中的強製字段(IIRC 一些供應商之前支援將此作為擴展)。的內容現在,客戶端對 HTTP 1.1 的支援無所不在。
不幸的是,SSL(後來的 TLS)增加了一些問題。建立 SSL/TLS 會話需要伺服器向用戶端提供涵蓋所請求主機名稱的證書,但 HTTP 請求只有在建立 SSL/TLS 會話之後才會到達。
SubjectAltName
透過使用該欄位或在該欄位中使用通配符,可以使一個憑證涵蓋多個主機名稱CommonName
。然而,這帶來了管理挑戰,特別是當涉及的主機名稱位於不同所有權的域下時。
因此 TLS 引入了「伺服器名稱指示」(SNI)擴充。透過此擴展,客戶端在 TLS 握手過程中將請求的主機名稱傳送到伺服器。然後伺服器可以提供適當的憑證。不幸的是,雖然所有主要 SSL/TLS 實現的當前版本都支援 SNI,但舊版本花了很長時間才不再使用。
答案4
使用 DNS,您可以根據需要為單一 IP 位址分配任意數量的名稱(在您的主機檔案例如,您可以簡單地用空格分隔每個名稱)。使用 DNS 伺服器,您還可以將多個 IP 位址指派給一個名稱。它不限於一對一的關係。
Web 伺服器知道要為哪個站點提供服務檢查請求的 URL。它查看請求的網域、請求的連接埠以及使用的協定。這與 DNS 無關,由 HTTP 協定處理。