どうもこんにちは。
先日、こんな問題が。
「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がお届けしました。