首頁 >php框架 >Laravel >詳解Laravel路由domain解決多域名問題

詳解Laravel路由domain解決多域名問題

藏色散人
藏色散人轉載
2021-03-30 17:15:053942瀏覽

以下由laravel教學專欄為大家介紹Laravel 路由研究之domain 解決多網域問題,希望對需要的朋友有幫助!

詳解Laravel路由domain解決多域名問題

Laravel 路由研究之domain 解決多域名問題

材質準備

  • 一份乾淨的laravel
  • 兩份Nginx設定文件,主要配置如下:

    server_name *.amor_laravel_test_1.amor;
    root /var/www/amor_laravel_test/public;
    index index.php index.html index.htm;
    server_name *.amor_laravel_test.amor;
    root /var/www/amor_laravel_test/public;
    index index.php index.html index.htm;

#將網域分割為參數

Route::domain('{account}.{webname}.{suffix}')->group(function () {

    Route::get('user/{id}', function ($account, $webname, $suffix, $id) {
        // 可以在请求中接收到被分割的参数,可能的使用场景:在单独路由中需要根据不同的域名处理不同的需求

        dd($account, $webname, $suffix, $id);

    });
});

##注意: 若account不固定,可以將Nginx Server Name 配置為泛型: *.example.com

關於多網域

設定兩個不同的網域如下:

  1. server_name *.amor_laravel_test.amor;
  2. server_name *.amor_laravel_test_1.amor;

##如何讓Laravel匹配不同的網域名稱?

方式1:直接在route/web.php中使用domain區分

Route::domain('{account}.amor_laravel_test.amor')->group(function () {

    Route::get('user/{id}', function ($account, $id) {
        //

        dd($account, $id);

    });
});

Route::domain('{account}.amor_laravel_test_1.amor')->group(function () {

    Route::get('user/{id}', function ($account, $id) {
        //

        dd(111, $account, $id);

    });
});

方式2:透過設定RouteServiceProvider 區分
  • #新增方法:
        protected function mapSelfRoutes()
        {
            Route::domain('{account}.amor_laravel_test_1.amor')
                ->middleware('web')
                ->namespace($this->namespace)
                ->group(base_path('routes/self.php'));
        }
  • 註冊
          public function map()
          {
              $this->mapApiRoutes();
      
              $this->mapWebRoutes();
      
              $this->mapSelfRoutes();
      
              //
          }
    • 新增路由檔案

      Route::get('/user', function ($account) {
          dd($account);
      });
      注意: 必須全部設定domain,如果只設定了self 那麼在相同請求路徑下,未設定domain的將會先配對到。

      【推薦:最新的五個Laravel影片教學

      關於路由中的Action在多網域下的說明


      首先,我們需要知道Action決定了路由會綁定到哪個控制器,還有一點要注意,路由中的Action屬性,決定了輔助函數route() 產生的url。

      假如,我們的路由配置如下:
      • 第一個路由
      Route::get('/', function () {
          if(\Illuminate\Support\Facades\Auth::check()) {
              return redirect('index');
          } else {
              return redirect('login');
          }
      });
    • 第二個路由
    • Route::get('/', function () {
          if(\Illuminate\Support\Facades\Auth::check()) {
              return redirect('index');
          } else {
              return redirect('login');
          }
      });

      一模一樣,都是呼叫內建的login路由,控制器也一樣,我們再看模板中的form表單

      <form method="POST" class="form-horizontal" action="{{ route(&#39;login&#39;) }}">
      ---
      </form>
      route() 輔助函數,會去讀取路由namelist 中載入的login,如果我們在RouteServiceProvider 中將這兩個路由檔案同時載入進來,

      public function map()
      {
          $this->mapApiRoutes();
      
          $this->mapWebRoutes();
      
          $this->mapSelfRoutes();
      
          //
      }
      那麼:不區分namespace或不區分控制器都會導致route 輔助函數產生的絕對路徑是最後一個路由domain ,因此如果我們的邏輯一致,只是想透過簡單的修改,透過不同的網域區別不同的站點,我們需要做判斷,按需載入:

      public function map()
      {
          if(request()->getHost() == env('ONLINEDOWN_DOMAIN')) {
              $this->mapApiRoutes();
          }
      
          if(request()->getHost() == env('PCSOFT_DOMAIN')) {
              $this->mapPcsoftRoutes();
          }
      
          $this->mapWebRoutes();
          //
      }

      總結:


      1.推薦第二種方式來區分域名,優點在於路由分離,結構清晰,
      2.domain不僅可以作為區分子域名來使用,也可以做參數分割,不同域名區分等
      3.注意Laravel的路由匹配順序,希望大家能認真的做一遍,體驗一下,做到心中有數
      4.既然已經區分開域名,那麼就可以綁定到不同的控制器,或者綁定不同的模型,大家靈活應用

      ####

      以上是詳解Laravel路由domain解決多域名問題的詳細內容。更多資訊請關注PHP中文網其他相關文章!

      陳述:
      本文轉載於:segmentfault.com。如有侵權,請聯絡admin@php.cn刪除