Safariで発生するプロトコルエラー

どうもこんにちは。

先日、こんな問題が。
「iPhoneのSafariでhttps://~~のサイトにアクセスすると、ページが表示されなかったり、画面遷移しなかったり、なんか変。」
とのこと。

WindowsのChromeやIE、AndroidのChromeやFireFoxなんかでは、特に問題なく動作するのに
iPhone(今回発生したのはiPhone XR)のSafariだと上のような事象になる。

困りました。

先人たちはすでにこの壁を乗り越えてらっしゃいました。
備忘録として、まとめます。


環境

こんな感じです。

EC2ではApacheが稼働しており、ロードバランサにSSL証明書を置いて、httpsでアクセスできるようにしています。
https://hoge.fugaにアクセスすると、ロードバランサを経由して
EC2のApacheがレスポンスを返す、という流れです

ま、AWSを使うときによくある構成ですね(知ったかぶり)。


事象

ここで、Safariからhttps://hoge.fugaにアクセスし、web inspector でエラーを確認しました。
発生したエラーは、下のとおりです。

"The operation couldn't be completed. Protocol error" (NSPOSIXErrorDomain:100)

プロトコルエラーですね。


原因

クライアント<—>ロードバランサ間ではHTTP/2、
ロードバランサ<—>EC2間ではHTTP/1.1で通信すると、Apacheからのレスポンスに
Upgrade: h2, h2c
のような Upgrade ヘッダが含まれてきます。
このヘッダをSafariが受け取ることで、失敗したりコネクションの破棄をしたりしてしまうようです。

参考リンク
https://help.poralix.com/articles/iphone-does-not-open-https-site-safari-nsposixerrordomain

ちなみに、httpでアクセスする分には大丈夫なようです。
今時httpのみでアクセスするようなサイトねーよ、
というツッコミは心の中に押し込めましょう。


対策

どちらかだけでOKだと思われます。

その1:ロードバランサの設定

ロードバランサで、HTTP/2を無効にしてあげればOKです。
※私はこちらで対応しました。

参考リンク
https://qiita.com/ameyamashiro/items/8d4be0f11ffe12472052

その2:Apacheの設定

LoadModuleで設定しているmod_http2を無効にしてあげればよいそうです。
ロードバランサの設定ができない場合は、こっちでやる必要がありそうです。

参考リンク
https://dev.classmethod.jp/cloud/aws/resolve-safari-and-alb-https-connection-errors/


まとめ

わかってしまえばなんてことはないことですが、忘れがちな内容かと。
※確かに、以前も同じような場面に出くわしたような、そうでもないような・・・

Safariあるある、として覚えておいて損はなさそうです。
とっとと修正してくれないかなー

r.tanakaがお届けしました。

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です