1

我有一个“这行得通吗?” 问题。

我正在构建一个多租户应用程序。将配置 DNS 和 Apache,以便多个子域指向该站点。

站点
1.example.com站点2.example.com 站点
3.example.com

ETC ...

我将使用 $request->getHost() 返回的值根据子域传递不同的内容。

对于大多数请求,我将从主机名派生和验证整数 site_id 值。这将在数​​据库查询中用于检索和交付适当的内容。

我还将使用 {% render url(route) %} 使用 twig 子模板,其中子模板路由的操作将根据主机提供自定义内容。它可能会呈现一个具有使用主机名构造的名称的唯一模板。

我希望用户能够在“站点”之间切换而无需再次登录。我可以将 PHP 会话 cookie 和 Symfony 的“记住我”cookie 的域设置为 .example.com(注意点)。

我已经用这个想法做了一些简单的测试,它似乎有效。有没有我忘记的问题或陷阱?我不想做没有真正支持的事情。我对缓存等事情有点紧张。Symfony 对我访问具有多个主机名的站点感到满意吗?

我启用了 Symfony 反向代理,尽管 app/cache/prod/http_cache 似乎总是为空,但它似乎仍然可以正常工作,所以我猜缓存并没有真正起作用。我猜那是一个不同的主题。我需要了解更多关于缓存的信息,但总的来说,Symfony 反向代理会对此感到满意吗?缓存是基于完整 URL 还是仅基于路由?

我知道有新的按主机名路由功能。我认为这对我没有用处,因为我希望无论主机如何都可以执行相同的操作方法。

我很好,但在我承诺之前,我真的很感激任何评论。

谢谢

4

1 回答 1

1

我意识到这对你来说可能已经太晚了,但我想我还是会插话的。

简短的回答,我在生产中使用了一个与您基于 symfony2.1 描述的非常相似的网站,并且效果很好。

长答案,首先要注意:它还没有使用太多的 symfony2 缓存系统,所以正如你所描述的那样,那里可能存在陷阱。正如他们所说,计算机科学实际上只有两个难题;命名事物、缓存失效和一个错误。

您提到的各种子系统似乎都很明智,并且与我所做的类似。我会将所有与“我是 site1 还是 site2?”相关的代码集中到一个服务中,然后您可以将其传递给例如模板帮助程序或其他自定义服务。

设置防火墙。将 .remember_me.cookie 和 framework.security.cookie_domain命名为 .example.com 将允许您跨所有域无缝登录(同样重要的是,注销),例如对于那些被允许查看 site1 和 site2 的用户。这里的一个问题是,正确实现 cookie 安全性的浏览器将需要在您的域名中至少有一个点(不包括前导点)......所以如果您的开发机器是 localhost.localdomain 并且您正在尝试在 .localdomain 上设置 cookie ,你可能会有点摸不着头脑。(我对自己不知道这一点感到非常恼火。)

正如您所提到的,按主机名路由在这种情况下并不是很有用。尽管您可以想象将主机名作为参数传递给您的所有控制器操作,但如果您对每个请求都执行此操作,则这是反 DRY。最好创建一个 kernel.request 监听器。

其他随机提示:

$router->getContext()->setHost( 'site2.example.com' );
$url = $router->generate( 'homepage', array(), true );

将允许您生成指向其他子域的链接。

希望一切都对你有用!

于 2013-04-17T09:51:11.610 回答