Laravel 一个项目上多个域名的路由问题

需求

  1. www、m 和 zh 的 / 访问的是网站首页
  2. 除去 www、m 和 zh 这三个子域名,其他所有子域名的 / 都是访问的城市专题页(跟网站首页不一样),专题页是根据自域名去数据库中查询数据并展示,没有查到的返回 404 页面。

目前解决方案

Route::group(['domain' => '{name}.' . config('app.tld'), 'namespace' => 'Web'], function () {
    $hosts = [
        'www.xxx.com',
        'zh.xxx.com',
        'm.xxx.com'
    ];
    if (array_key_exists('HTTP_HOST', $_SERVER) && in_array($_SERVER['HTTP_HOST'], $hosts)) {
        return null;
    }
    Route::get('/', 'SeoController@index');
});

Route::get('/', 'IndexController@index');

问题

采用上面的方法可以在路由不生成缓存的情况下正常路由,但是缓存后,所有的都会路由到第一个路由组里去,然后根据子域名查数据库,www、m 和 zh 这种就会导致页面 404;

请教有没有更优雅的方法来实现这样的需求?

《L05 电商实战》
从零开发一个电商项目,功能包括电商后台、商品 & SKU 管理、购物车、订单管理、支付宝支付、微信支付、订单退款流程、优惠券等
《L03 构架 API 服务器》
你将学到如 RESTFul 设计风格、PostMan 的使用、OAuth 流程,JWT 概念及使用 和 API 开发相关的进阶知识。
最佳答案

可以使用路由的全局约束 路由《Laravel 8 中文文档》

示例: Route::pattern('name', '^(?!www).*$');

这边只排除了 www,其他的自己写下正则

3年前 评论
讨论数量: 5

nginx 做解析试试? 把二级域名当做参数 给 laravel 可能更好处理业务吧

3年前 评论
GeorgeKing (楼主) 3年前
PhoenixIcy (作者) 3年前

可以使用路由的全局约束 路由《Laravel 8 中文文档》

示例: Route::pattern('name', '^(?!www).*$');

这边只排除了 www,其他的自己写下正则

3年前 评论

试下把3个固定的域名分别做为3个路由组放在路由文件的最上面,

Route::group(['domain' => 'www.xxx.com'])
Route::group(['domain' => 'zh.xxx.com'])
Route::group(['domain' => 'm.xxx.com'])

城市专题页的子域名放在这3个路由组的下面就行。

3年前 评论
GeorgeKing (楼主) 3年前

楼主,这东西应该用nignx的配置文件来处理吧

3年前 评论

用路由中间件识别当前域名,然后往$request回写一个变量,就像$request->user()那样用,比如$request->domain

3年前 评论

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