Symfony 子域路由

Posted

技术标签:

【中文标题】Symfony 子域路由【英文标题】:Symfony sub domain routing 【发布时间】:2021-07-01 02:33:27 【问题描述】:

我们如何使用子域来访问 Symfony 中的子文件夹。

问题是,如何将子域路由到文件夹?

example.com         -> example.com/*
app.example.com     -> example.com/app/*
admin.example.com   -> example.com/admin/*
api.example.com     -> example.com/api/*

一些详细的例子:

url requested           controller called           route name
----------------------------------------------------------------
example.com/            example.com/                main_home
example.com/login       example.com/login           main_login

app.example.com/        example.com/app/            app_home
app.example.com/profile example.com/app/profile     app_profile

到目前为止,每个控制器都可以进行硬编码

Symfony: @Route("/", name="app_home", host="example.com")
Symfony: @Route("/", name="sub1_home", host="sub1.example.com")

但我还没有找到隐藏子文件夹的方法。因此,要访问个人资料页面,您仍然需要访问 app.example.com/app/profile。这违背了在 url 中包含 /app 的子域的目的。

是的,显然任何子域都会在整个应用程序中限制子文件夹。所以你不能有 example.com/api/ 因为那会保留给 api.example.com

【问题讨论】:

【参考方案1】:

@Bradmage 你为什么要把不需要复杂的事情复杂化? 有

app.example.com     -> example.com/app/*
admin.example.com   -> example.com/admin/*
api.example.com     -> example.com/api/*

将使授权网址增加三倍,因为您需要为每个等添加登录路由,可能还需要添加其他内容。

您为什么不离开它并将每个子域指向您的应用程序(或严格的应用程序)并依赖用户角色?

也可以查看symfony中的access_control和host参数:https://symfony.com/doc/current/security/access_control.html

【讨论】:

谢谢你,我想我有点想多了。 access_control path: '^/admin', roles: ROLE_USER_ADMIN, host: admin.example\.com$ 这也解决了我的一些其他问题。【参考方案2】:

此解决方案将拦截 REQUEST_URI 并将子域添加为根文件夹(如果尚未使用)。

意味着 app.example.com 和 app.example.com/app 都将访问同一个页面。

if(substr($_SERVER['HTTP_HOST'], 0, strlen('app.')) === 'app.'
    && substr($_SERVER['REQUEST_URI'], 0, strlen('/app')) !== '/app')

    $_SERVER['REQUEST_URI'] = '/app'.$_SERVER['REQUEST_URI'];

这样做的好处是能够将所有控制器放在文件夹中。如果您有多个配置文件控制器,它们都可以从 /profile 访问,但在不同的子域下。

【讨论】:

以上是关于Symfony 子域路由的主要内容,如果未能解决你的问题,请参考以下文章

Symfony 4如何使用React设置SPA(单页面应用程序)?

所有子域的 Symfony2 会话

symfony 应用程序与域/子域共享登录 cookie

Symfony2 子域防火墙在生产服务器上被忽略

如果已经在其他应用程序中登录主域,如何使用 symfony 安全登录到子域?

Symfony路由配置教程已开课