【AWS】EC2+ELB+WordPressサイトのSSL化(.htaccess)

2020-02-01AWS,ELB.htaccess,AWS,EC2,ELB,SSL

前提・やりたいこと

このサイトはWordPressで作成されているので、SSL化にあたっては「Really Simple SSL」という定番プラグインを使用しました。

しかし、サブディレクトリに全然関係ないHTMLファイルを置いてアクセスするとHTTPSにリダイレクトされない。「https://〜」とURL欄に入力すればHTTPSアクセスできるんですが、やっぱりHTTPでアクセスされた場合も自動でHTTPS通信になるようにリダイレクトして欲しい。
「.htaccess」でリダイレクトの設定をすればいけるはずなのでトライ。 ……が、半日くらい躓いてしまいました。愚か。延々続くリダイレクトループ。
解決までに確認したこと・やったことをメモします。 結論から言うと、「.htaccess」を元の状態に戻して、「Really Simple SSL」の設定を変更したらうまく行ったんですけど……。原因はプラグインのせいではなく、環境による「.htaccess」記述内容の違い、でした。

環境・状態

  • Webサーバー
    • Apache (EC2にインストール)
  • SSL証明書
    • AWS のACMで発行、動作確認済み
    • ELB(ロードバランサー)にSSL証明書を適用
  • WordPress
    • 「Really Simple SSL」でSSL化済み

よくある原因

「.htaccess」への追記内容を確認

# HTTP->HTTPSリダイレクトの設定(Apache)
<IfModule mod_rewrite.c>
RewriteEngine On RewriteCond %{HTTPS} off
RewriteRule ^(.*)$ https://%{HTTP_HOST}%{REQUEST_URI} [L,R=301] 
</IfModule>

どのサイトを見てもこの記述だったので間違いないっぽい(と思っていた)。

ルートディレクトリに配置した「.htaccess」には既にWordPress用の定義があるので、それの上部に挿入すること。 しかし、このコードを挿入するとリダイレクトループに陥る。

ファイルの文字コードを確認

  • UTF-8(BOMなし)
  • 改行コード:LF

     上記の設定を確認。解決しない、次。

ファイルのパーミッションを確認

  • 604

確認。解決しない、次。

解決:SSL化プラグインの設定変更

  1. 「.htaccess」リダイレクト定義(エラー原因)を削除する。
  2. WordPressの「設定」→「SSL」→「セッティング」で以下をオンにする
    • Enable 301 .htaccess redirect:ON
  3. 「.htaccess」に追記された内容を確認する
Enable 301 .htaccess redirect:ON

何やらHTTPSへのリダイレクトルールが追記されている。 うん?これまでググって自分が記載してきたのとちょっと違うな……RewriteCondのあたりが。
この状態で「https://mkdev.mtnk.work/subdir」とHTTPアクセスをすると……

httpでアクセス

鍵マーク!つまりhttps!

HTTPSにリダイレクトされました。 つまり、記述内容の問題らしい。

原因

どうやら「RewriteCond」の定義が原因っぽい。

# 自分で追記
RewriteCond %{HTTPS} off 

# SSL化プラグインが追記
RewriteCond %{HTTP:X-Forwarded-Proto} !https

単に「HTTPSでない」というだけではだめらしいが、世の中のWordPress構築サイトの皆さんはこの設定でうまくいっているのに、何故?

「%{HTTP:X-Forwarded-Proto}」でググったところ以下のQ&Aを発見。AWS公式です。

ELB の Classic Load Balancer で HTTP トラフィックを HTTPS にリダイレクトする方法を教えてください。

以下のような書き換えルールを追加します。
RewriteEngine On
RewriteCond %{HTTP:X-Forwarded-Proto} =http
RewriteRule .* https://%{HTTP:Host}%{REQUEST_URI} [L,R=permanent]

https://aws.amazon.com/jp/premiumsupport/knowledge-center/redirect-http-https-elb/

公式に答えがありました。「.htaccess」の設定を疑い、記述内容を疑い、プラグインを疑い、ようやくELB(ロードバランサー)にSSL証明書を適用している場合は書く内容が普通と違う、というところにたどり着いた……。お疲れ!

さらに、上の回答内容ですとELBを使っている場合は「httpd.conf」を編集するのがベストプラクティスだそうです。「.htaccess」ではなく。そっか……。また次回。

2020-02-01AWS,ELB.htaccess,AWS,EC2,ELB,SSL

Posted by ケイ