我有子域名的网站(news.site.com,events.site.com等)。 我被添加到配置我的自定义网址规则,谁通过DB中的请求的网址文章找到并通过动作显示调用文章控制器
例如:'news.site.com/some-article-with-custom-url'
我希望在db文章中找到url = 'some-article-with-custom-url'
并在ArticleController中调用actionShow(。
但是在news.site.com和events.site.com上我希望找到包含不同site_id的文章(db中的列)
news.site.com - select * from article where site_id = 1 ...
events.site.com - select * from article where site_id = 2 ...
我可以在哪里初始化一些子域设置,如果在UrlManager级别我必须已经有这个设置吗?
'urlManager' => [
'rules' = [
...
[
'class' => 'common\components\ArticleUrlRule'
],
]
]
实现此类的解析请求:
public function parseRequest($manager, $request) {
$articleId = Article::getArticleIdByUrl($request->pathInfo);
if ( !empty($articleId) ) {
return [
'article/show',
[
'id' => $articleId
]
];
}
return false;
}
答案 0 :(得分:0)
有几种方法可以做到这一点,从简单和hacky到坚硬和良好的形式。
我认为最好的方法是使用一个URL配置:
'urlManager' => [
'rules' = [
[
'<controller:[\w-]+>/<id:\d+>'=>'<controller>/view',
]
]
]
然后在ArticleController
:
public function actionShow($id)
{
// This might be better as a definition list stored in config or something
$site = null;
$sub = Yii::$app->request->hostInfo; // Put some logic here to split out subdomain
switch($sub){
case 'site1':
$site = 1;
}
$articleId = Article::find()->where(['id' => $id, 'site' => $site]);
}
有点东西。它可以变得更加强大,一般来说,从那里开始变得更好,但我相信这是一个很好的方法。
答案 1 :(得分:0)
处理此问题的最简单方法,可能还有其他方法,从将每个子域定义为Web服务器上的站点开始。正如您所看到的,您可能有三个站点,一个主站点和两个子域名,另外两个web
文件夹的副本分别命名为news and events
,因此在您的Yii2项目根目录中,您将拥有{ {1}}目录,它们将成为Web服务器上三个网站的三个文档的根目录。
在每个网络目录的web, events and news
中定义一个变量或一个常量来表示index.php
,以便在需要时在您的应用程序中使用它:
site id