AWSELBでHTTPSへリダイレクトしているはずなのに、HTTP通信が発生して「安全ではありません」と出る。
初回アクセスはHTTPSでアクセスするのだが、戻るボタン→再度リンクからアクセスするとHTTPになる。
キーワードだけで調べると「ELBでHTTP/2通信を無効化すればよい」的な情報にヒットしたが、 下記リンクの対象はApacheのようで、なんかひっかかるので少し調べることにした。
https://salumarine.com/only-safari-cannot-load-a-webpage/
切り分け
- 同じドメインの別ページでは発生していない。
- 別の開発環境でも発生していない。
- 単体環境でも発生していない。
なので
- 呼び出し元がおかしい
- AWSのなにかが悪い
の二択まで絞れた
同等のサーバーを構築する
本番環境と同等の構成を作る。AWSなら証明書含めてさっさと作れるので楽。
下記のように構築した。なおELBでHTTP→HTTPSリダイレクトしている。
構築方法は別サイトや本に死ぬほどあるのでここには記載しない。
開発者ツールでデータを見てみる
実際に構築してみると、リダイレクトが二回発生しているのである。
動きとしては
呼び出しているURLを確認すると確かに、
- 末尾スラッシュなし
- ファイル指定が明示的にされていない
のである
/hogehoge?param1=1
他URLで確認してみる
他の指定方法で調べてみるとリダイレクトは発生しない
/hogehoge/?param1=1 /hogehoge/index.html?param1=1
原因(推察)と対策
通信関連の推測
だいたいのサーバーは末尾にスラッシュ(トレイリングスラッシュというらしい)がないと自動リダイレクトするらしい。
URLの最後に付ける「トレイリング スラッシュ」ありなしの違いはSEOに影響するのか? | 海外SEO情報ブログ
で、APサーバー側の挙動にもよるが、おそらく下記のような感じの通信になっている模様。
リダイレクトする担当がそれぞれ違う。
EC2(IIS)側としてはELBに対してレスポンスを返すのだが、ELB⇔EC2間はHTTP通信になっているはず(EC2に証明書入れてないので)
よって、IISが返却するLocation属性はhttpのURLが記載されるが、結局ELBでhttpはhttpsにリダイレクトされる。
根本原因は?
正直分からないが、iPhoneのSafariで「二回リダイレクトしているが、リダイレクト途中の状態のページがキャッシュされてる?」 みたいな動きになってるんじゃないでしょうか。 iPhoneの開発環境がないので推察しかできない。
対策としては明示的にスラッシュとファイル名を記載しましょう、ということになる。
/hogehoge/index.html?param1=1
明示的にというのは大事ですね。