通過 http 服務埠 443 會創建 400 Bad Request Error 而不是重定向
因此,為了後代,我正在嘗試配置我的伺服器,以便即使有人嘗試訪問 http://domain.com:443,他們也會被正確重定向到該站點的 https 版本(https://域.com)。
在測試 http://domain.com:443 之類的內容時,它沒有正確重定向到 https://domain.com,而是被一個 400 Bad Request 頁面擊中,其中包含以下內容:
錯誤的請求
您的瀏覽器發送了此伺服器無法理解的請求。原因:您對啟用 SSL 的伺服器埠使用純 HTTP。請改用 HTTPS 方案訪問此 URL。
Apache/2.4.18 (Ubuntu) 伺服器在 sub.domain.com 埠 443
我嘗試在我
000-default.conf
的中包含以下幾行<VirtualHost *:80>
:RewriteEngine On RewriteCond %{HTTPS} off RewriteRule (.*) https://%{SERVER_NAME}/$1 [R,L]
但它沒有用。
此問題發生在所有域、子域和伺服器 IP 本身上。
可能相關,嘗試對letsencrypt進行空執行會返回以下內容:
Domain: domain.com Type: connection Detail: Failed to connect to 123.123.123.123:443 for TLS-SNI-01 challenge
對於啟用站點的文件夾中列出的每個域。
TL;TR:您不能在同一埠 (443) 上同時提供 HTTP 和 HTTPS。
雖然理論上可以根據來自客戶端的第一個數據來確定客戶端是發送 HTTP 請求(即
GET ..
或類似請求)還是開始 TLS 握手(\x16\x03...
),但大多數 Web 伺服器不這樣做。相反,他們希望客戶端能夠正常執行,即在一個埠(通常為 80)上使用純 HTTP,在另一個埠(通常為 443)上使用 HTTPS。您的 URL
http://example.com:443
導致瀏覽器向埠 443 發出純 HTTP 請求。但伺服器期望 TLS 在那裡,這意味著您的純 HTTP 請求是意外的。在這種情況下,Apache 至少足以檢查普通 HTTP 請求的傳入數據,以便它可以為您提供更有用的描述:原因:您對啟用 SSL 的伺服器埠使用純 HTTP。請改用 HTTPS 方案訪問此 URL。
如果您嘗試與其他伺服器進行此類請求,那麼它們要麼完全關閉連接而不會出現任何錯誤,要麼只是掛起,因為它們仍然希望從客戶端獲得 TLS 握手。