CakePHP3・Herokuでデプロイしたサイト全体をhttpsにしたい(SSL化)

CakePHP3・Herokuでデプロイしたサイト全体をhttpsにしたい時ありますよね。

なんか難しい設定が必要なのかと思ってましたが、意外と簡単な設定でできました。

その手順を説明していきます。

【自分の環境】
macOS Catalina
PHP7.4.2
CakePHP3.8
MAMP5.7
Apache2.2
MySQL5.7

やることは2つ

まずRouter.phpを設定します。

そしてwebrootにある「.htaccess」を設定します。

この2ステップです。

どちらか一方ではダメみたいです。

まずRouter.phpを設定

結構深いところにあります。

vendor/cakephp/cakephp/src/Routing/Router.phpを開いてください。

該当部分は以下のようになっています。

(書き換え前)

Configure::write('App.fullBaseUrl', $base);

上記を下記に書き換えます。

(書き換え後)

Configure::write('App.fullBaseUrl', 'https://'.$_SERVER["HTTP_HOST"]); // 書き換える

これでサイト全体がhttpsを利用するようになります。

ただこのままではhttpに飛ばされる設定になっているので、httpに行っちゃいます。

なのでhttpからhttpsに無理やり飛ばす設定をこれからします。

webrootにある「.htaccess」を設定

いきなり補足ですが、webrootなのでスマホ版を作っている方は2つあります。

元々は以下のようになっています。

(書き換え前)

<IfModule mod_rewrite.c>
    RewriteEngine On
    RewriteCond %{REQUEST_FILENAME} !-f
    RewriteRule ^ index.php [L]
</IfModule>

(書き換え後)

<IfModule mod_rewrite.c>
    RewriteEngine On
    RewriteCond %{HTTP:X-Forwarded-Proto} !=https // この行を追加
    RewriteRule ^/?(.*) https://%{HTTP_HOST}%{REQUEST_URI} [R,L] // この行を追加
    RewriteCond %{REQUEST_FILENAME} !-d // この行を追加
    RewriteCond %{REQUEST_FILENAME} !-f
    RewriteRule ^ index.php [L]
</IfModule>

3行追加しています。

これでhttpからhttpsに無理やり飛ばす設定になりました。

正直、中身はよくわかってないです。

サイトによっても記述の仕方が違いました。

自分は上記で行けています。

終わりに

SSL化というと何やら難しい設定をしなければならないのかと思いましたが、Herokuでデプロイしたということもあって簡単でした。

これがサーバーから構築するとなると、また話は違ってきそうです。

ただ勉強にはなりそうですね。

いつかはHerokuに頼らない構築をやってみたいと思っています。

ありがとうございました。