gologiusの巣

プログラミングなどの技術メモです。誰かの役に立てるとうれしいです。

AWS ELB +EC2で構築しているWEBサイトにて、iPhoneのSafariだけHTTP通信になる不具合

iPhoneSafariだけ挙動がおかしい。

AWSELBでHTTPSへリダイレクトしているはずなのに、HTTP通信が発生して「安全ではありません」と出る。

初回アクセスはHTTPSでアクセスするのだが、戻るボタン→再度リンクからアクセスするとHTTPになる。

キーワードだけで調べると「ELBでHTTP/2通信を無効化すればよい」的な情報にヒットしたが、 下記リンクの対象はApacheのようで、なんかひっかかるので少し調べることにした。

https://salumarine.com/only-safari-cannot-load-a-webpage/

切り分け

  • 同じドメインの別ページでは発生していない。
  • 別の開発環境でも発生していない。
  • 単体環境でも発生していない。

なので

  • 呼び出し元がおかしい
  • AWSのなにかが悪い

の二択まで絞れた

同等のサーバーを構築する

本番環境と同等の構成を作る。AWSなら証明書含めてさっさと作れるので楽。

下記のように構築した。なおELBでHTTP→HTTPSリダイレクトしている。

構築方法は別サイトや本に死ぬほどあるのでここには記載しない。

f:id:gologius:20210821124731p:plain

開発者ツールでデータを見てみる

実際に構築してみると、リダイレクトが二回発生しているのである。

f:id:gologius:20210821130104p:plain

動きとしては

  1. HTTPSの末尾スラッシュなしページをリクエス
  2. (なぜか)HTTPで末尾スラッシュありのページへリダイレクト
  3. ELBの機能で、HTTPSのスラありページへリダイレクト

呼び出しているURLを確認すると確かに、

  • 末尾スラッシュなし
  • ファイル指定が明示的にされていない

のである

/hogehoge?param1=1

他URLで確認してみる

他の指定方法で調べてみるとリダイレクトは発生しない f:id:gologius:20210821131324p:plain

/hogehoge/?param1=1
/hogehoge/index.html?param1=1

原因(推察)と対策

通信関連の推測

だいたいのサーバーは末尾にスラッシュ(トレイリングスラッシュというらしい)がないと自動リダイレクトするらしい。

URLの最後に付ける「トレイリング スラッシュ」ありなしの違いはSEOに影響するのか? | 海外SEO情報ブログ

で、APサーバー側の挙動にもよるが、おそらく下記のような感じの通信になっている模様。

リダイレクトする担当がそれぞれ違う。 f:id:gologius:20210821220746p:plain

EC2(IIS)側としてはELBに対してレスポンスを返すのだが、ELB⇔EC2間はHTTP通信になっているはず(EC2に証明書入れてないので)

よって、IISが返却するLocation属性はhttpのURLが記載されるが、結局ELBでhttpはhttpsにリダイレクトされる。

根本原因は?

正直分からないが、iPhoneSafariで「二回リダイレクトしているが、リダイレクト途中の状態のページがキャッシュされてる?」 みたいな動きになってるんじゃないでしょうか。 iPhoneの開発環境がないので推察しかできない。

対策としては明示的にスラッシュとファイル名を記載しましょう、ということになる。

/hogehoge/index.html?param1=1

明示的にというのは大事ですね。 f:id:gologius:20210821131620j:plain