LoginSignup
6
10

More than 3 years have passed since last update.

laravelでマルチドメイン対応

Last updated at Posted at 2020-06-01

laravelプロジェクトでマルチドメイン対応の備忘録

概要:アンケートページのドメインとそれ以外のドメインで分けたい。

マルチドメインとは

一つのサーバーで複数のドメインを管理する運営方法。
メリット:複数のドメインを一つのサーバーで管理できるのは楽。サーバー費用が削減できる
https://sakuramarina.com/episode_11/

やり方の概要

① .envファイルにドメインを設定する
② config/app.phpでドメイン名を定義
③ ミドルウェアの作成
④ app/Http/kernel.phpでミドルウェアの登録
⑤ web.phpでrouteをミドルウェアごとにまとめる

1.envファイルにドメインを設定する

どこでもいいので、ドメインを設定します。
今回はステージングの環境なのでlocalの値です。

.env

MAIN_DOMAIN=127.0.0.1
SURVEY_DOMAIN=localhost

2.ドメインを定義する

app.php
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を返す。

Middleware/Survey.php
<?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を返す。

Middleware/Main.php
<?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でミドルウェアの登録

Kernel.php
protected $routeMiddleware = [
 'domain.survey' => \App\Http\Middleware\Survey::class,
 'domain.main' => \App\Http\Middleware\Main::class,
]

5.web.phpでrouteをミドルウェアごとにまとめる

web.php
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文に追加してあげます。

Survey.php

    public function handle($request, Closure $next)
    {
        if (
            config('app.survey') !== request()->getHost() &&
            config('app.env') !== 'testing'  //追加
        )
        {
            return \abort(403);
        }
        return $next($request);
    }
Main.php

    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値

phpunit.xml

<php>
 <env name="APP_ENV" value="testing">
 ///省略
</php>
6
10
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
6
10