执行多域名部署前,应完成了单域名部署除域名解析的步骤
下面举例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目录是否独立绑定域名模式,如果是多域名部署模式要改成true
localStorage.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文件即可