laytp推荐使用单域名部署,如果你想将静态资源单独一个域名访问(比如你使用了CDN加速静态资源),接口和html使用单独域名访问,不同的应用接口之间使用单独域名访问,可以进行多域名部署,接下来是多域名部署的教程
执行多域名部署前,应完成了单域名部署除域名解析的步骤
下面举例4个域名,并说明4个域名的作用以及绑定到的目录(本地解析域名可以修改本地的hosts文件,都指向到127.0.0.1的IP)
localadmin.laytp.com/public/admin/ 目录
server{listen 80;server_name localadmin.laytp.com;root "yourCatalog/public/admin/";}
localstatic.laytp.com
/public/static/ 目录nginx配置举例
server{listen 80;server_name localstatic.laytp.com;root "yourCatalog/public/static/";location ~ .*\.(eot|ttf|otf|woff|woff2|svg|yml)$ {#添加下列头部,解决跨域问题add_header Access-Control-Allow-Origin *;add_header Access-Control-Allow-Headers X-Requested-With;add_header Access-Control-Allow-Methods GET,POST,OPTIONS;}}
注意点,.json文件浏览器是禁止跨域请求的,所以,在多域名部署模式下,不要请求静态资源的.json文件。所有数据类请求都使用api接口提供
localapi.laytp.com/public/ 目录localadminapi.laytp.com/public/ 目录访问后台的静态Html页面的域名 和 访问后端的api接口的域名 的主域名需要相同。
也就是 localadmin.laytp.com 和 localadminapi.laytp.com 两个域名的主域名 laytp.com 部分需要相同,否则即使你做了后续的操作, ThinkPHP6 中基于 Session 的功能将不能使用。比如 验证码 功能, CSRF-TOKEN 功能。
为什么要实现使用4个域名来访问Laytp
/public/static/ 目录下的文件同步至CDN/public/admin/index.html和/public/admin/login.html两个文件
localStorage.setItem("adminDomainModel","true");// /public/admin目录是否独立绑定域名模式,如果是多域名部署模式要改成truelocalStorage.setItem("adminApiDomain","http://localadminapi.laytp.com");// 请求后台接口的域名localStorage.setItem("staticDomain","http://localstatic.laytp.com");// 请求静态资源的域名
UPDATE `lt_admin_menu` SET `href` = replace(`href`,'/admin/','/') WHERE `href` LIKE '/admin/%';
UPDATE `lt_admin_menu` SET `rule` = replace(`rule`,'/admin.','/') WHERE `rule` LIKE '/admin.%';
修改路由文件,/route/app.php
<?php//自定义路由use think\facade\Route;// api子域名路由指定Route::domain('localapi',function () {Route::rule('/plugin/:plugin', "laytp\library\PluginRoute@execute");Route::get('captcha/[:config]','\\think\\captcha\\CaptchaController@index');Route::rule('/:pathInfo', '/api.:pathInfo')->pattern(['pathInfo'=>'[\w\.\/]+']);Route::miss(function() {return json(["code" => 0,"msg" => '路由不存在',"data" => new stdClass()]);});});// adminapi子域名路由指定Route::domain('localadminapi',function () {Route::rule('/plugin/:plugin', "laytp\library\PluginRoute@execute");Route::get('captcha/[:config]','\\think\\captcha\\CaptchaController@index');Route::rule('/:pathInfo', '/admin.:pathInfo')->pattern(['pathInfo'=>'[\w\.\/]+']);Route::miss(function() {return json(["code" => 0,"msg" => '路由不存在',"data" => new stdClass()]);});});
index:id: "2" ## 标识 ID , 建议与菜单项中的 ID 一致href: "/console.html" ## 页面地址
## 网站配置logo:## 网站名称title: "Laytp Admin"## 网站图标image: "/admin/images/logo.png"
[DOMAIN]api = "http://localapi.laytp.com"adminapi = "http://localadminapi.laytp.com"static = "http://localstatic.laytp.com"
localadmin.laytp.com 来访问Laytp了编辑器插件,UEditor和MEditor中都有图片上传的功能。
如果使用多域名部署Laytp,UEditor和MEditor两个编辑器的单图上传都将有获取iframe值跨域问题。
UEditor的多图上传功能,可以将UEditor的js放置到admin目录下,修改编辑器统一加载的ueditor.html,引用admin目录下的ueditor的js文件可以避免跨域问题
为了方便使用编辑器的上传功能,后端整个项目不要进行跨域部署。实际部署时,仅设置app/controller/api目录为独立域名,后端的项目使用一个独立的域名即可。实际部署时,就只需要api.domain.com和admin.domain.com两个域名即可。上述的后续步骤,仅需修改route文件即可