关于多应用域名路由的PR,是否应该不经过nginx

ric

之前一直在用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 ) ,看看大佬评估下,是否能合进去

504 1 0
1个回答

walkor

重写path这个在nginx里就一句配置的事情,就不在webman做了。
如果有需要webman重写path,像你pr那样改下 support\Request.php 类就好了

  • ric 2023-09-10

    嗯嗯,好的。我只是搜索了一下,看见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应用
    ]
    ];

  • wocall 2023-09-10

    做图折腾一晚上,没整成功,放弃了。

  • ric 2023-09-10

    做什么图??

  • ric 2023-09-10

    你是说昨天折腾一晚上吧?哈哈哈,不要走,继续。 用我上面那个,写个方法就实现TP那样的了

  • wocall 2023-09-11

    嗯嗯。我这没有TP,只有nginx+php+webman。好几个应用都计划放webman里,分域名,没折腾出来。

🔝