假设我的yii网站基础域为http://ii.local
。
除基本域外,所有控制器操作都可以显示
我需要http://events.ii.local
来处理控制器event
通过电话$this->createUrl('/event/index',array('code' => 'guruevent'))
我需要生成的网址为http://events.ii.local/guruevent
通过电话$this->createUrl('/site/login')
我需要生成的网址为http://ii.local/site/login
。
'urlManager'=>array(
'urlFormat'=>'path',
'showScriptName'=>false,
'caseSensitive'=>false,
'rules'=>array(
'http://events.ii.local/<code:\w+>'
=> '<controller:event>/<action:index>',
'http://events.ii.local/<code:\w+>/<action:\w+>'
=> '<controller:event>/<action>/<code>',
'<controller:\w+>/<action:\w+>'
=> '<controller>/<action>',
),
),
使用/event/index?code=guruevent
生成事件子域的Urls,而不使用events.ii.local子域。
单域路由工作正常但我需要为少数控制器和模块使用少数子域。我也试图设置request-&gt; baseUrl但是只要我将其设置为http://ii.local/
所有路由停止并且所有网址都会打开相同的主页。
请建议修复。
答案 0 :(得分:1)
交换您的第一条和第二条规则。规则按顺序处理,并使用第一个匹配。 UrlManager不会寻找最佳匹配,而是先到先得。
自
$this->createUrl('/event/index',array('code' => 'guruevent'))
匹配第一条规则提供的模式,它将使用该规则,而不管code
存在的“额外”数据。
一个好的经验法则是始终将最具体的规则放在首位,以确保它们匹配,然后使用一般规则来完成任何不符合细节的规则。
答案 1 :(得分:0)
您可以使用自定义功能来创建网址。例如url($route, $params=array())
。你在里面使用Yii::app()->createUrl()
,依赖于$route
会在你的其他主机名前加上它。然后在您的项目中始终使用此函数来创建URL。
如果您有信心,您还可以增强您的实施并为该功能添加更多参数,例如$schema=''
或$absolute=false
。这样,您就可以将此功能用于项目中需要的所有类型的URL创建。
另一种方法是编写自定义urlManager
组件,该组件从CUrlManager
延伸,然后覆盖createUrl()
。在那里,您可以执行与上面建议相同的操作:检查$route
并创建适当的URL。