Laravel 路由在 2 个环境中与子域一起工作
Laravel route works with subdomain in 2 environments
我正在编写一个平台来生成子网站。
我有这样一条路线,在当地运行得很好:
//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看起来很棒,但是路由不起作用,将我带到主域的父页面。
我做错了什么?
谢谢
如果您使用 laravel homestead,则需要在 etc/hosts 文件和 [ 上注册每个子域=41=],就像您对主域所做的那样。现在,我将推荐结构:
app.test
subdomain1.app.test
subdomain2.app.test
我不建议使用类似的东西:
subdomain1.app1.test
subdomain2.app2.test
我的意思是,你可以,但这没有多大意义,而且你还必须在你的 Homestead/Local 和生产环境中注册所有这些。
对于我建议的方法,您可以在环境变量上进行设置。 https://laravel.com/docs/6.x/configuration#environment-variable-types
您可以将您 want/need 的任何环境变量添加到 .env 文件,有一个 APP_URL 变量,但这包括 http 协议,您可以添加如下内容:
APP_DOMAIN=app.test
并用于生产
APP_DOMAIN=yourapp.com
然后在routes文件中通过helper方法访问它env
,你可以省略第二个参数,或者用它来设置一个默认值,以防你忘记把它放在.env文件中.
Route::domain('{slug}.' . env('APP_DOMAIN', 'default.com'))->group(function () {
Route::get('/','WebsitesController@show')->name('web_website_show');
});
顺便说一句,这可能有助于使用命名路由设置 slug 值:
像这样使用域路由在 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
});
我正在编写一个平台来生成子网站。
我有这样一条路线,在当地运行得很好:
//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看起来很棒,但是路由不起作用,将我带到主域的父页面。
我做错了什么?
谢谢
如果您使用 laravel homestead,则需要在 etc/hosts 文件和 [ 上注册每个子域=41=],就像您对主域所做的那样。现在,我将推荐结构:
app.test
subdomain1.app.test
subdomain2.app.test
我不建议使用类似的东西:
subdomain1.app1.test
subdomain2.app2.test
我的意思是,你可以,但这没有多大意义,而且你还必须在你的 Homestead/Local 和生产环境中注册所有这些。
对于我建议的方法,您可以在环境变量上进行设置。 https://laravel.com/docs/6.x/configuration#environment-variable-types
您可以将您 want/need 的任何环境变量添加到 .env 文件,有一个 APP_URL 变量,但这包括 http 协议,您可以添加如下内容:
APP_DOMAIN=app.test
并用于生产
APP_DOMAIN=yourapp.com
然后在routes文件中通过helper方法访问它env
,你可以省略第二个参数,或者用它来设置一个默认值,以防你忘记把它放在.env文件中.
Route::domain('{slug}.' . env('APP_DOMAIN', 'default.com'))->group(function () {
Route::get('/','WebsitesController@show')->name('web_website_show');
});
顺便说一句,这可能有助于使用命名路由设置 slug 值:
像这样使用域路由在 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
});