動機
因為已經把開發環境docker化了,但是由於AWS上面的憑證是使用 ACM
也就是AWS的免費憑證做為開發,內部還是使用http 80作為傳輸手段
這部分攸關於AWS的網站架構設計,有機會再拿出來寫
總之結論就是,希望在開發的時候走80(http),而上線的時候自動變為443 (https)
過程
本來使蠢蠢的讓每個頁面都提升至https,但是這樣會導致開發環境也被升到https
443沒有服務,所以直接死亡
Laravel是一個很成熟的framework,已經內建處理這種情況的函式了
首先建立一個Middleware,方便所有環境共用
app/Http/Middleware/SslMiddleware.php
<?php
namespace App\Http\Middleware;
use Closure;
class SslMiddleware
{
/**
* Handle an incoming request.
*
* @param \Illuminate\Http\Request $request
* @param \Closure $next
* @return mixed
*/
public function handle($request, Closure $next)
{
if(in_array(env('APP_ENV'),json_decode(env('SSL_UPGRADE_ENV'),true))){
\URL::forceScheme('https');
}
return $next($request);
}
}
這邊的 \URL::forceScheme('https'); 就是重點了(PS 如果是5.3版以前的,叫做\URL::forceSchema('https');,最後一個字是a,合理懷疑官方升版的時候打錯字了XDDDDDDDDDDDD)
整段的大意是,要是發現 APP_ENV 的環境是在 SSL_UPGRADE_ENV 的陣列內,那麼就提升
在這之前請在.env內部加上 SSL_UPGRADE_ENV
我這邊是這樣設定的
APP_ENV=lab SSL_UPGRADE_ENV=["lab","staging","production"]接著告訴laravel在什麼情況下要使用這個middleware
app/Http/Kernel.php
protected $middlewareGroups = [
'web' => [
\App\Http\Middleware\EncryptCookies::class,
\Illuminate\Cookie\Middleware\AddQueuedCookiesToResponse::class,
\Illuminate\Session\Middleware\StartSession::class,
// \Illuminate\Session\Middleware\AuthenticateSession::class,
\Illuminate\View\Middleware\ShareErrorsFromSession::class,
\App\Http\Middleware\VerifyCsrfToken::class,
\Illuminate\Routing\Middleware\SubstituteBindings::class,
\App\Http\Middleware\SslMiddleware::class,
],
'api' => [
'throttle:60,1',
'bindings',
],
];
注意 \App\Http\Middleware\SslMiddleware::class 這句是新加的代表在使用web middleware的時候,自動提升成ssl
如果想知道route有什麼會經過這個middleware,可以看RouteServiceProvider.php
app/Providers/RouteServiceProvider.php
protected function mapWebRoutes()
{
Route::middleware('web')
->namespace($this->namespace)
->group(base_path('routes/web.php'));
Route::prefix('dashboard')
->middleware('web')
->namespace($this->namespace)
->group(base_path('routes/dashboard.php'));
這邊會告訴你哪個路由跑哪邊,就可以很快速的整理出哪些需要走ssl了
留言
張貼留言