バリデーションでリファラー(URL)とパラメーターが適切であるときにサイトを表示させる処理


要件

ここで満たしたい要件は以下の3つ。
・特定のサイトから遷移してきた人限定でサイトを表示する。
 (直接URLを叩いたら404が返される)
・リファラーについているパラメーターの値と本サイトのパラメーターが同じ値ならサイトを表示する
・①の条件を一度でも満たした人がURLを直接叩いたらサイトが表示されるようにする
*Middleweaerの作成が必要なので作成方法がわからない方はこちら
(Laravel素人の俺が書いたから間違ってる可能性有りなので他のサイトを参考にした方がいい気はする)
https://qiita.com/yoshiakidayo/items/06c90a995c4761e648e3

リファラーとは、アクセスログに記載されている情報のひとつで、当該ファイルを取得する(ブラウザで表示する)直前に閲覧していたページのURLを内容とする情報らしい。
参考サイト
https://www.mitsue.co.jp/case/glossary/l_011.html

まずリファラーを取得する

   //url()->previous()でリファラーのURLが取得できる。
   $previousUrl = url()->previous();

参考サイト
https://blog.capilano-fw.com/?p=2537

次に適切であるかを判断したいので三項演算子を使用する。

   // リファラー(直前のサイト)のURLが適切であればtrue
   $getUrl = $previousUrl  == 'リファラーのURL' ? true : false;

次にパラメーターを取得する

//パラメーターが?parameter=testの場合
$params = $request->parameter;

一度訪れたユーザーは閲覧できるようにしたいためセッションを保持させるのでセッションを取得するコードを書く

    // sessionに保存せされている値を取得
    $flag = session()->get('flag'); 

条件分を書いていく。

       if($getUrl == true){
            // リファラー(直前のサイト)のURLが正しければifを実行
            if($params  == config('app.get_params')){
                // 取得したパラメーターが適切であればsessionにflag_truを保存
                session()->put('flag', 'flag_true'); 
            }else{
                abort(404);
            }
        }elseif(!$flag) {
            // $flagの値が入っていなければ404を返す
            abort(404);
        }

完成形

Middlewere

 public function handle($request, Closure $next)
    {

        // リファラー(直前のサイト)のURL
        $previousUrl = url()->previous();

        // リファラー(直前のサイト)のURLが適切であればtrue
        $getUrl = $previousUrl  == 'リファラーのURL' ? true : false;

        // パラメーターを受け取る
        $params = $request->parameter;

        // sessionに保存せされている値を取得
        $flag = session()->get('flag'); 


        if($getUrl == true){
            // リファラー(直前のサイト)のURLが正しければifを実行
            if($params  == config('app.get_params')){
                // 取得したパラメーターが適切であればsessionにflag_truを保存
                session()->put('flag', 'flag_true'); 
            }else{
                abort(404);
            }
        }elseif(!$flag) {
            // $flagの値が入っていなければ404を返す
            abort(404);
        }

        return $next($request);
    }

あとはMiddlieweareに登録して上記の処理をTOPページのみに適用させる

web.php

Route::get('/', 'TopController@index')->middleware('VerifyUrl');

その他のページには新しくMiddleweaerを作成し下記の処理を適用

 public function handle($request, Closure $next)
    {
        // $getUrl = url()->previous();
        // dd($getUrl);

        $flag = session()->get('flag');

        if(!$flag){
            abort(404);
        }

        return $next($request);
    }

web.php

  Route::get('shops', 'ShopController@index')->middleware('VerifySession');
  Route::view('/faq', 'static/faq')->middleware('VerifySession');
//などなど