單個 Laravel 專案同時配置不同域名 api.domain(使用者端介面) 和 admin.domain(管理員端)

賀鈞威發表於2018-01-15

為什麼要用不同的域名?

laravel 經常是用 /admin 的這種方式來訪問管理員端的,但是這樣使用者端和管理員端是在同一個域名下的,可能會有幾個問題:

  • 使用者是可以透過修改 url 來進入管理員端的登入介面,或者說由於管理員端的 bug 導致使用者誤入了後臺的敏感地區
  • 使用者端的 session 和管理員端的 session 衝突,只能登陸一個,另一個的 session 就被 replace 了
  • 一些常用的駭客爆破工具也可以對 url 進行猜解爆破(比如說御劍),雖然域名也有類似於 subDomainsBrute 這些爆破工具,但是能增加點入侵難度,就是增強了安全性
  • 就是看著不舒服,就是不爽,就是想要用域名

所以我們有時想要用不同的域名來訪問,例如 admin.hippo-studio.com ,來操作管理員端,用api.hippo-studio.com來提供使用者端介面(如果前後端沒有分離,那就是直接用hippo-studio.com來訪問了)

後端是不是要分成兩個laravel的專案來寫?

對於需要快速開發的小型專案來說,由於專案的前臺(假設是給使用者端 api 介面)和後臺(管理員端)的程式碼可複用性很強,如果用兩個專案,我們可能要寫很多重複的程式碼,比如說建立的所有 Model 幾乎相同,所以我們常常是寫在同一個專案裡的。如果專案將來變大,可以考慮分成兩個專案來寫。

如何做到多域名

修改 app/Providers/RouteServiceProvider.php

    public function map()
    {
        $this->mapApiRoutes();

        $this->mapAdminRoutes();

        //
    }

    protected function mapAdminRoutes()
    {
        Route::group([
            'domain' => config('app.admin_domain'),
            'middleware' => 'web',
            'namespace' => $this->namespace,
        ], function ($router) {
            require base_path('routes/admin.php');
        });
    }

    protected function mapApiRoutes()
    {
        Route::group([
            'domain' => config('app.api_domain'),
            'middleware' => 'api',
            'namespace' => $this->namespace,
        ], function ($router) {
            require base_path('routes/api.php');
        });
    }

config/app.php

    'api_domain' => env('API_DOMAIN', 'api.hippo-studio.com'),
    'admin_domain' => env('ADMIN_DOMAIN', 'admin.hippo-studio.com'),

.env

API_DOMAIN=api.hippo-studio.local
ADMIN_DOMAIN=admin.hippo-studio.local

然後在 routes 目錄下新建一個 admin.php 寫路由

Route::group([
    'namespace' => 'Admin',
], function () {
    Auth::routes();
});

然後配置 nginx

server {
    #配置兩個 server name
    server_name api.hippo-studio.com admin.hippo-studio.com;
    # 處理跨域,always 會對非 200 http 響應也附帶跨域頭
    add_header 'Access-Control-Allow-Origin' '$http_origin' always;
    add_header 'Access-Control-Allow-Headers' 'Content-Type, Accept, Cookie, X-Requested-With, X-XSRF-TOKEN' always;
    add_header 'Access-Control-Allow-Methods' 'GET,POST,OPTIONS,PUT,DELETE' always;
    add_header 'Access-Control-Allow-Credentials' 'true' always;

    location / {
        try_files $uri $uri/ /index.php?$query_string;
    }

    # php-fpm 相關
    location ~ \.php$ {
        try_files $uri /index.php =404;
        fastcgi_split_path_info ^(.+\.php)(/.+)$;
        fastcgi_pass unix:/var/run/php/php7.0-fpm.sock;
        fastcgi_index index.php;
        fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
        include fastcgi_params;
    }
}

本作品採用《CC 協議》,轉載必須註明作者和本文連結

相關文章