前提
常時SSL化したにも関わらず、asset()
とかroute()
とかで吐き出されるURLがhttpになってしまう!というお悩みに対するベストプラクティスをまとめてみた。
ケース1: クライアントとアプリ間でSSL通信する場合
AppServiceProvider.php
のboot
にてUrlGenerator
を注入し、forceschema
を使ってURL生成時のプロトコルを指定する。
app/Providers/AppServiceProvider.php
use Illuminate\Routing\UrlGenerator;
class AppServiceProvider extends ServiceProvider
public function boot(UrlGenerator $url)
{
$url->forceScheme('https');
}
}
開発環境はhttpだよ!という場合は、app.env
を参照して分岐させておく。
app/Providers/AppServiceProvider.php
public function boot(UrlGenerator $url)
{
if (in_array(config('app.env'), ['prd', 'stg'], true)) {
$url->forceScheme('https');
}
}
}
ケース2: クライアントとLB間でSSL通信する場合(LBとアプリ間はHTTP通信)
Laravel >= 5.5
TrustedProxy
を利用する。具体的にはミドルウェアのTrustProxiesクラス
を良い感じに設定する。
app/Http/Middleware/TrustProxies.php
<?php
namespace App\Http\Middleware;
use Illuminate\Http\Request;
use Fideloper\Proxy\TrustProxies as Middleware;
class TrustProxies extends Middleware
{
/**
* The trusted proxies for this application.
*
* @var array
*/
protected $proxies = '**'; //ここを**にする。
/**
* The current proxy header mappings.
*
* @var array
*/
protected $headers = [
Request::HEADER_FORWARDED => 'FORWARDED',
Request::HEADER_X_FORWARDED_FOR => 'X_FORWARDED_FOR',
Request::HEADER_X_FORWARDED_HOST => 'X_FORWARDED_HOST',
Request::HEADER_X_FORWARDED_PORT => 'X_FORWARDED_PORT',
Request::HEADER_X_FORWARDED_PROTO => 'X_FORWARDED_PROTO',
];
}
参考:Laravel5.5 HTTPリクエスト - 信用するプロキシの設定
Laravel < 5.5
ケース1と同じ方法で対処する、またはcomposer.json
に以下を追加して、5.5
以上では同梱されていたTrustedProxy
をインストールする。
composer.json
{
"require": {
"fideloper/proxy": "^3.3"
}
}