#laravelプロジェクトでマルチドメイン対応の備忘録
概要:アンケートページのドメインとそれ以外のドメインで分けたい。
##マルチドメインとは
一つのサーバーで複数のドメインを管理する運営方法。
メリット:複数のドメインを一つのサーバーで管理できるのは楽。サーバー費用が削減できる
https://sakuramarina.com/episode_11/
##やり方の概要
① .envファイルにドメインを設定する
② config/app.phpでドメイン名を定義
③ ミドルウェアの作成
④ app/Http/kernel.phpでミドルウェアの登録
⑤ web.phpでrouteをミドルウェアごとにまとめる
1.envファイルにドメインを設定する
どこでもいいので、ドメインを設定します。
今回はステージングの環境なのでlocalの値です。
MAIN_DOMAIN=127.0.0.1
SURVEY_DOMAIN=localhost
2.ドメインを定義する
return
[
'main' => env('MAIN_DOMAIN', '127.0.0.1'),
'survey' => env('SURVEY_DOMAIN', 'localhost'),
]
3.ミドルウェアの作成
ミドルウェアとはリクエストをコントローラに渡す前のクッションのようなものと認識しています
https://codezine.jp/article/detail/11643
ミドルウェアの作成は以下のコマンド
php artisan make:middleware Survey
app.phpのsurveyキーはapp.survey
request()->getHost()
現在のURLのドメインを取得できる
https://stackoverflow.com/questions/39835650/how-do-you-get-the-http-host-with-laravel-5
現在のドメインがlocalhost以外だったら403を返す。
<?php
namespace App\Http\Middleware;
use Closure;
class Survey
{
/**
* Handle an incoming request.
*
* @param \Illuminate\Http\Request $request
* @param \Closure $next
* @return mixed
*/
public function handle($request, Closure $next)
{
if (config('app.survey') !== request()->getHost())
{
return \abort(403);
}
return $next($request);
}
}
現在のドメインが127.0.0.1以外だったら403を返す。
<?php
namespace App\Http\Middleware;
use Closure;
class Main
{
/**
* Handle an incoming request.
*
* @param \Illuminate\Http\Request $request
* @param \Closure $next
* @return mixed
*/
public function handle($request, Closure $next)
{
if(config('app.main') !== request()->getHost())
{
return \abort(403);
}
return $next($request);
}
}
.envの値はconfigを使ってあげる必要がある
https://hiroto-k.hatenablog.com/entry/2018/03/28/213000
4.app/Http/kernel.phpでミドルウェアの登録
protected $routeMiddleware = [
'domain.survey' => \App\Http\Middleware\Survey::class,
'domain.main' => \App\Http\Middleware\Main::class,
]
5.web.phpでrouteをミドルウェアごとにまとめる
Route::group(['middleware'=>['domain.main']],function()
{
//ここにmainで使用するルートを書く
});
Route::group(['middleware'=>['domain.survey']],function()
{
//ここにsurveyで使用するルートを書く
});
##詰まったところ
middlewareで期待した条件分岐にならなかったので、var_dump(config('app.main'))
などとして中身を確認するとenvの値が反映されていなかった。app.mainはenvで設定したMAIN_DOMAIN=127.0.0.1なのに、中身は127.0.0.1:8000になっていた。最初envの設定は127.0.0.1:8000としていて途中で書き換えたが、環境変数はそのままキャッシュを持っていたためだった。
対応方法:envの値を反映させるために
php artisan config:cache
を行った。
https://qiita.com/kawax/items/ea881a6c18b8d4e94d83
##ミドルウェアでテストを通してあげる場合
ミドルウェアにテスト環境でのロジックを書いていないので、このままではテストを行うと全て403で返ってきてしまします。
なので、if文に追加してあげます。
public function handle($request, Closure $next)
{
if (
config('app.survey') !== request()->getHost() &&
config('app.env') !== 'testing' //追加
)
{
return \abort(403);
}
return $next($request);
}
public function handle($request, Closure $next)
{
if(
config('app.main') !== request()->getHost() &&
config('app.env') !== 'testing' //追加
)
{
return \abort(403);
}
return $next($request);
}
app.envはenvファイルで定義されています。
testingはvalue値
<php>
<env name="APP_ENV" value="testing">
///省略
</php>