关于多应用域名路由的PR,是否应该不经过nginx
之前一直在用tp的域名路由做一些应用绑定,在搭建站点的时候,考虑了webman,也在寻找域名路由的替代方式。后来找到了https://www.workerman.net/q/5908 这个求助贴,也出来了https://www.workerman.net/plugin/11 这个插件,但是总觉的哪里不对,然后发现路由上,我还是得加上应用的路由名称,比如toadmin应用,我还是得访问 /toadmin/config 才能访问,如果要省略掉/toadmin,那么还得在nginx上做代理。 嗯。。。 我好像就是想去掉nginx,结果还是不得用上?
然后大概看了下原理,我觉的对这个需求来说,更多的是想让访问域名直接访问到自己想要的应用中,那么应该是在请求的路由中进行更改,而非直接限制寻找的应用 app。
所以我重写了path方法,这个方法先进行了是否开启域名路由判断,然后再进行路由的寻找,如果有配置,那么自动更改请求的路由,比如 abcd.com 域名我指向了 toadmin, 那么前端访问abcd.com/config的时候,我自动在abcd.com后面加/toadmin,就变成了 abcd.com/toadmin/config, 这样其实就是实现了限制abcd.com访问toadmin应用。
而对于开启路由配置模式的来说,每个不同应用路由需要用分组:Route::group('/toadmin', function () {}) 包起来而已。 当然如果有人,尝试把Route::group('/toadmin', function () {}) 里面的子路由写向了 touser 应用的控制器,那么通过abcd.com 域名也是能访问到的,而我觉的这个是允许的,而且有必要的,因为的确会存在一些公共控制器的情况,比如toadmin、touser都有个路由 域名/config 读取 行政区域数据, 那么这个控制器是可以写在common应用中的,而通过 路由的形式进行指向,而不是需要必须在toadmin、touser上各写一个,当然如果开发人员乱用,我觉的是开发人员本身不规范导致的问题。
这个迭代应该是替代多应用域名绑定插件的方式,而且实现了不需要通过nginx代理即可实现短url。
已提交PR( https://github.com/walkor/webman/pull/384 ) ,看看大佬评估下,是否能合进去
1个回答
年代过于久远,无法发表回答
重写path这个在nginx里就一句配置的事情,就不在webman做了。
如果有需要webman重写path,像你pr那样改下 support\Request.php 类就好了
嗯嗯,好的。我只是搜索了一下,看见thinkphp那么转过来的基本上都遇到了这个问题,这个应用不多是在nginx里是一句配置的事,但在整个公司的统一研发规范上的确是很方便的一件事,它使我们在docker上作为统一的开发环境的时候,不需要添加另外的容器,实现了功能,同时在生产环境的时候,不需要运维多去专注转发的配置问题,针对复杂的集群项目,一套代码可能针对了十几个端的应用,所以我会觉的,在配置指向的时候就实现了转发功能,而不再特意迭加一层nginx是非常棒的。
虽然不合并到webman,但后面tp转过来的同行有需要的可以去PR( https://github.com/walkor/webman/pull/384/commits/cfa8016945113eff2fc55b31ca992dcf415e045f )中自取吧。
1、在support\Request.php添加
//重写获取path用于多路由
public function path()
{
if (!isset($this->_data['path'])) {
if(config('domain.enable', false)){
//如果开启了域名路由
$uri = $this->uri();
$bind = config('domain.bind', []);
$domain = $this->host(true);
if(isset($bind[$domain])) {
$uri = '/' . $bind[$domain] . $uri;
}
}
$this->_data['path'] = (string)\parse_url($uri, PHP_URL_PATH);
}
return $this->_data['path'];
}
2、添加配置文件 config/domain.php
<?php
return [
//是否开启域名路由
'enable' => true,
// 多应用绑定关系
'bind' => [
// 'abc.com' => '', // 不属于任何应用
'abcd' => 'touser', // 绑定到touser应用
'abce' => 'toadmin', // 绑定到toadmin应用
]
];
做图折腾一晚上,没整成功,放弃了。
做什么图??
你是说昨天折腾一晚上吧?哈哈哈,不要走,继续。 用我上面那个,写个方法就实现TP那样的了
嗯嗯。我这没有TP,只有nginx+php+webman。好几个应用都计划放webman里,分域名,没折腾出来。