单个 Laravel 项目同时配置不同域名 api.domain(用户端接口) 和 admin.domain(管理员端)

为什么要用不同的域名?

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 协议》,转载必须注明作者和本文链接
本帖由 Summer 于 6年前 加精
《L01 基础入门》
我们将带你从零开发一个项目并部署到线上,本课程教授 Web 开发中专业、实用的技能,如 Git 工作流、Laravel Mix 前端工作流等。
《L04 微信小程序从零到发布》
从小程序个人账户申请开始,带你一步步进行开发一个微信小程序,直到提交微信控制台上线发布。
讨论数量: 13
luphp_安轮粉丝

homestead里如何配置同一个项目多域名,小白瑟瑟发抖提问

6年前 评论

@luphp 我也没研究过,不过,如果map里面多加几个站点(域名)但是把目录指向同一个,应该能实现吧

6年前 评论
luphp_安轮粉丝

@无远 可以实现,我试过了...

6年前 评论

谢谢,之前就为 api 接口,是用 url 体现还是域名提现而烦恼。 其实很想用域名来体现 api 的,就是因为路由不能在 api 文件里支持,所有就放弃了。 看了你的文章,原来还是可行的。

6年前 评论
Aaron

file
和我一样 ?

6年前 评论

@luphp_安轮粉丝
sites:

  • map: inbuff.test
    to: /home/vagrant/code/inbuff/public
  • map: account.inbuff.test
    to: /home/vagrant/code/inbuff/public
    这样的,加上去了记得刷新配置文件,并且添加 hosts 到对应地址
6年前 评论

推荐用 https://github.com/nWidart/laravel-modules 这个包配合多域名
如果要做到 session 共享,需要在 config/session.php 编写
'domain' => env('SESSION_DOMAIN', '.xx.com'),

6年前 评论

原来的代码里贴的nginx配置文件是这样的,多了一个'在末尾,大家注意下,现在已经改过来了

location / {
        try_files $uri $uri/ /index.php?$query_string';
    }
6年前 评论

用 Route::domain 比较直接

4年前 评论
白小二

没啥用啊,前台域名一样可以访问后台路由,只要路由后缀正确,你这只是把admin去掉了 home/auth/login照样可以登陆后台

3年前 评论

讨论应以学习和精进为目的。请勿发布不友善或者负能量的内容,与人为善,比聪明更重要!