HTTPS 不適用於 Safari
我有一個 EC2 實例,Apache 作為網路伺服器(Wildfly 作為應用伺服器,雖然我不確定它與這個問題有什麼關係)。在 EC2 前面,我有一個負載均衡器,它終止 HTTPS 並應用 SSL 證書。
HTTP 和 HTTPS 在 Chrome 中都可以正常工作,但不幸的是在 Safari 中不行。訪問http://test.papereed.com>工作正常,但訪問<https://test.papereed.com會出現錯誤
"Safari can't open the page. The error is "The operation couldn't be completed. Protocol error" (NSPOSIXErrorDomain:100)"
我查看了 /etc/httpd/logs/error_log 和 /etc/httpd/logs/access_log 以及 Safari 控制台,但沒有找到任何解決問題的提示。這就是我的知識有多遠:-(任何關於如何追踪這個問題的提示將不勝感激。
curl(如果使用 HTTP/2 支持編譯)表現出同樣的問題,但顯示了原因:
http2 錯誤:收到了無效的 HTTP 標頭欄位:幀類型:1,流:1,名稱:
$$ upgrade $$, 價值:$$ h2,h2c $$
看起來您的伺服器正在提供對 HTTP/2 的升級,即使連接已經使用 HTTP/2 完成 - 這是沒有意義的。不僅如此,它還被明確禁止。從RFC 7540 第 8.1.2.2 節:
端點不得生成包含特定連接頭欄位的 HTTP/2 消息;任何包含特定於連接的頭欄位的消息必須被視為格式錯誤(第 8.1.2.6 節)…. 特定於連接的頭欄位,例如 Keep-Alive、Proxy-Connection、Transfer-Encoding 和Upgrade
它給我找了一個錯誤,因為 Apache 不應該使用 HTTP/2 發送這個標頭。
我的猜測是你有這樣的配置
Protocols h2 h2c http/1.1
鑑於瀏覽器無論如何都不支持沒有 TLS 的 HTTP/2,並且 HTTP/2 over TLS 不需要 Upgrade 標頭,我建議您將此配置替換為
Protocols h2 http/1.1
這將禁用對沒有 TLS 的不需要的 HTTP/2 的支持,但應該希望以這種方式擺脫 Upgrade 標頭,因為這只需要從純 HTTP 升級到純 HTTP/2。
編輯:根據 OP 的評論,更改
Protocols
配置沒有幫助。mod_http2
有必要通過刪除標頭來明確解決此行為(即錯誤)Upgrade
:Header unset Upgrade