Apache-2.2

HTTPS 與 HTTP 不同的域名

  • October 7, 2009

我有一個 Apache 2.0 httpd 實例,我想同時託管 HTTP 和 HTTPS。它們共享相同的 IP 地址,HTTP 將來自埠 80,HTTPS 將來自埠 443(標準)。我有 2 個域 www.example.com 和 secure.example.com 都指向該 IP 地址。

現在的問題是:我只想要到 www.example.com 的 HTTP 流量,只想要到 secure.example.com 的 HTTPS 流量。這意味著 www.example.com 沒有 HTTPS,secure.example.com 也沒有 HTTP。

我的 httpd.conf 看起來像

ServerName www.example.com
Listen 10.0.0.1:80
Listen 10.0.0.1:443

NameVirtualHost 10.0.0.1:80
NameVirtualHost 10.0.0.1:443

<VirtualHost 10.0.0.1:80>
   ServerName www.example.com
</VirtualHost>

<VirtualHost 10.0.0.1:443>
   ServerName secure.example.com
   SSLEnable # ... and other SSL stuff
</VirtualHost>

現在發生的情況是,我可以同時使用 HTTP 和 HTTPS 訪問這兩個域名。我查找了基於埠的虛擬主機和基於名稱的虛擬主機,似乎我所擁有的應該可以工作。我不想在 SSL 中託管多個域,所以那裡沒有問題。我只是希望使用者被拒絕使用 HTTPS 訪問 www.example.com,反之亦然。

如果沒有單獨的 IP 別名,這甚至可能嗎?

將 HTTP 解析到 secure.example.com 很容易。您只需創建一個額外的虛擬主機來定向到 HTTPS:

<VirutalHost 10.0.0.1:80>
   ServerName secure.example.com
   Redirect / https://secure.example.com/
</VirtualHost>

將 HTTPS 解析到 www.example.com 更難。問題是通常您不能使用 HTTPS 進行基於名稱的虛擬主機。原因是 SSL 連接是在 Apache 知道您嘗試連接的主機之前建立的,因此不知道要發送哪個 SSL 證書,所以必鬚髮送它知道的第一個證書。結果是,如果您嘗試使用基於名稱的 SSL,您將在除一個虛擬主機之外的每個虛擬主機上收到錯誤的證書,並且瀏覽器將向使用者顯示錯誤。您可以使用 *.example.com 的萬用字元證書或使用帶有主題備用名稱的證書來解決此問題。不幸的是,這些證書要花更多的錢,而且您可能會發現在更不知名的客戶端上支持不完整。

您可以為 HTTPS 添加一個與 HTTP 類似的虛擬主機:

<VirtualHost 10.0.0.1:443>
  ServerName www.example.com
  Redirect / http://www.example.com/
</VirtualHost>

如果您解決了 SSL 問題,這將正常工作而不會出現錯誤。如果您不這樣做,那麼客戶端應該會收到有關主機名與證書不匹配的錯誤消息,但隨後應該重定向到 http。

引用自:https://serverfault.com/questions/71988