Symfony 子域路由

Symfony sub domain routing

我们如何使用子域访问 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

@Bradmage 为什么要把不需要复杂的东西复杂化? 拥有

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

将使授权增加三倍 url 因为您需要为每个等添加登录路由,可能还有其他事情。

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

你也可以在 symfony 和主机参数中检查 access_control: https://symfony.com/doc/current/security/access_control.html

此解决方案将拦截 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 访问,但在不同的子域下。