Apache-2.2

apache https 適用於其他 http 虛擬主機

  • February 2, 2016

我已經搜尋了很多,我也嘗試了很多東西,但仍然找不到問題。

我在 ubuntu 伺服器 12.04 lts 上安裝了 apache 2.2.22 伺服器。我有許多 http 虛擬主機和 2 個 https 虛擬主機。一切正常,但奇怪的是,如果我在瀏覽器上提供我的一個 http 站點,而使用 https,它會將我重定向到實際的 https 站點。這很尷尬,我真的不知道是什麼原因造成的。

有人也遇到過嗎?你能幫忙嗎?提前致謝

不清楚你在問什麼,但有兩個潛在的問題:

  1. Apache 將嘗試找到最佳的 vhost 來匹配,如果沒有其他匹配,則預設為第一個匹配 IP 地址和埠的 vhost,這有時會給不理解這一點的人帶來意想不到的結果。

因此,如果您有以下情況:

NameVirtualHost *:80

<VirtualHost *:80>
   ServerName www.example1.com
   DocumentRoot /www/example1/htdocs
</VirtualHost>

<VirtualHost *:80>
   ServerName www.example2.com
   DocumentRoot /www/example2/htdocs
</VirtualHost>

<VirtualHost *:443>
   ServerName www.example1.com
   DocumentRoot /www/example1/htdocs
</VirtualHost>

當您嘗試訪問https://www.example2.com時,您可能會感到驚訝。您可能認為它要麼出錯,要麼通過 https 提供 example2 站點,但實際上 Apache 所做的是在埠 443 上查找匹配項,當它找不到完全匹配項時,它預設為第一個匹配項,因此提供與https://www.example1.com相同。

2)或者,如果你的意思是你有這個配置:

NameVirtualHost *:80

<VirtualHost *:80>
   ServerName www.example1.com
   DocumentRoot /www/example1/htdocs
</VirtualHost>

<VirtualHost *:80>
   ServerName www.example2.com
   DocumentRoot /www/example2/htdocs
</VirtualHost>

NameVirtualHost *:443

<VirtualHost *:443>
   ServerName www.example1.com
   SSLCertificateFile /ssl/cert1.crt
   DocumentRoot /www/example1/htdocs
</VirtualHost>

<VirtualHost *:443>
   ServerName www.example2.com
   SSLCertificateFile /ssl/cert2.crt
   DocumentRoot /www/example2/htdocs
</VirtualHost>

那麼在這種情況下,您會希望https://www.example2.com可以工作。

問題是通常 https 請求最初是針對 IP 地址發出的,沒有傳遞伺服器名,因此 Apache 不知道您想要哪個,所以它再次假定第一個並傳回 cert1.crt 以設置會話,這可能不正確。https 會話建立後,它會獲取 ServerName 並可以正確路由請求。

一個名為 SNI(伺服器名稱指示)的 https 更新允許 ServerName 與初始請求一起傳遞,因此將使用正確的證書,但這取決於您使用 OpenSSL 0.9.8f 或更高版本的伺服器以及您使用的瀏覽器(尤其是不支持此功能的 Windows XP 上的 IE)。如果這是一個問題(假設它涵蓋兩個域,則對兩者使用相同的證書,或者為每個域使用不同的 IP 地址)。

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