HTTPS 與 HTTP 不同的域名
我有一個 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。