yii createUrl规则返回带子域的url

时间:2013-03-27 10:53:22

标签: php url-rewriting yii routing

假设我的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/所有路由停止并且所有网址都会打开相同的主页。

请建议修复。

2 个答案:

答案 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。