Laravel 路由在 2 个环境中与子域一起使用

Posted

技术标签:

【中文标题】Laravel 路由在 2 个环境中与子域一起使用【英文标题】:Laravel route works with subdomain in 2 environments 【发布时间】:2020-05-24 00:06:55 【问题描述】:

我正在编写一个平台来生成子网站。

我有一条这样的路线,在当地运行得很好:

//Website
Route::domain('slug.domain.test')->group(function () 
    Route::get('/','WebsitesController@show')->name('web_website_show');
);

我希望能够使其在生产(其他领域)中也能正常工作,所以我做到了:

//Website
Route::domain('slug.domain')->group(function () 
    Route::get('/','WebsitesController@show')->name('web_website_show');
);

在我的模板中:

<a href=" route('web_website_show',['slug' => $website->slug, 'domain' => Request::getHost() ]) ">Website</a>

生成的 URL 看起来很神奇,但是路由不起作用并将我带到主域的父页面。

我做错了什么?

谢谢

【问题讨论】:

看起来更像是路由的东西,检查 Route::domain 【参考方案1】:

在 Laravel 中使用这样的域路由有点痛苦。

最近在一个应用程序中,我从应用程序 URL 中解析了域部分,然后将其设置为配置值,如下所示:

class AppServiceProvider extends ServiceProvider

    public function boot()
    
        config([
            'app.domain' => parse_url(config('app.url'), php_URL_HOST),
        ]);
    

然后你可以在你的域路由中使用它:

Route::domain('slug.'.config('app.domain'), function () 
    // Subdomain routes that work in all environments
);

【讨论】:

【参考方案2】:

如果您使用 laravel homestead,您需要在 etc/hosts 文件和 Homestead.yaml 上注册每个子域,就像您可能对主域。现在,我将推荐结构:

app.test
subdomain1.app.test
subdomain2.app.test

我不建议使用类似的东西:

subdomain1.app1.test
subdomain2.app2.test

我的意思是,你可以,但这没有多大意义,而且你还必须在你的 Homestead/本地和生产环境中注册所有这些。

对于我建议的方法,您可以在环境变量上进行设置。 https://laravel.com/docs/6.x/configuration#environment-variable-types

您可以在 .env 文件中添加您想要/需要的任何 env 变量,其中有一个 APP_URL 变量,但这包括 http 协议,您可以添加如下内容:

APP_DOMAIN=app.test

用于生产

APP_DOMAIN=yourapp.com

然后在路由文件上用辅助方法env访问它,你可以省略第二个参数,或者用它来设置一个默认值,以防你忘记把它放在.env文件中。

Route::domain('slug.' . env('APP_DOMAIN', 'default.com'))->group(function () 
    Route::get('/','WebsitesController@show')->name('web_website_show');
);

顺便说一句,这可能有助于使用命名路由设置 slug 值: Setting up named routes within a subdomain group in Laravel 5.7

【讨论】:

感谢您的回复。我没有尝试,因为第一个答案很好。但我毫不怀疑它成功了。非常感谢

以上是关于Laravel 路由在 2 个环境中与子域一起使用的主要内容,如果未能解决你的问题,请参考以下文章

使用 Laravel 进行子域路由

我的子域路由覆盖了我在 laravel 7 中的正常网络路由

子域路由在 Laravel 5 上不起作用 - WAMPServer

Laravel 5.4 通过子域运行所有路由

如何在 CodeIgniter 中为 Laravel 中的第一个项目定义子域路由?

Laravel 5,子域路由,带可选参数