Yii基本url重写

时间:2012-03-26 19:19:31

标签: url-rewriting yii url-routing

我是php的新手,mvc的新手,yii的新手,以及url-rewriting的新手。所以,对不起,如果我问一些非常基本的东西。

我隐藏了index.php(来自yii论坛中讨论的htaccess方法)

在我的urlmanager中,我有这个,

'urlFormat'=>'path',
             'rules'=>array( 
             '<controller:\w+>/<id:\d+>'=>'view',
             '<controller:\w+>/<action:\w+>/<id:\d+>'=>'<controller>/<action>',
             '<controller:\w+>/<action:\w+>'=>'<controller>/<action>' 
              ),
             'showScriptName'=>false,

我在view / site文件夹中有3个文件。

  1. '旅程',
  2. '邀请',
  3. 'LinkedIn'
  4. 现在,我的主页应该重定向到“旅程”操作(即应该打开'site / journey.php')

    所以,我猜,这将是

    '/' => 'site/journey'
    

    它也有效。

    现在,我希望'旅程/邀请'应该调用'邀请'动作,即应该打开'site / invite.php'

    而且,'journey / linkedin'应该调用'linkedin'动作,即'site / linkedin.php'。

    但是,

    'journey/invite' => 'site/invite',
    'journey/linkedin' => 'site/linkedin'
    

    无效。

    此外,有人可以帮助我理解这一点,

    <controller:\w+>/<id:\d+>
    

    即。什么是url中的控制器以及'w +'是什么意思?

    对指南的引用也会有所帮助。

    在bool.dev的建议之后编辑:

    更改了代码,如您所说(我之前也尝试过,删除所有默认规则)。 现在我的网址管理员就像,

        '/' => 'site/journey',
        'journey/invite' => 'site/invite',
        'journey/linkedin' => 'site/linkedin',
        '<controller:\w+>/<id:\d+>'=>'view',
        '<controller:\w+>/<action:\w+>/<id:\d+>'=>'<controller>/<action>',
        '<controller:\w+>/<action:\w+>'=>'<controller>/<action>', 
    

    但它会抛出错误

      

    “警告:require_once():open_basedir限制生效。   文件(/var/xyz.com /../ yii / framework / yii.php)不在允许范围内   路径(S):   (/usr/share/php:/usr/share/pear:/usr/share/php/libzend-framework-php:/var/*/tmp:/var/xyz.com)   在第12行的/var/xyz.com/journey.php中警告:   require_once(/var/xyz.com /../ yii / framework / yii.php):无法打开   stream:第12行/var/xyz.com/journey.php中不允许操作   致命错误:require_once():需要打开失败   '/var/xyz.com/../yii/framework/yii.php'   (include_path中= ':在/ usr /共享/ PHP的:在/ usr /共享/ PHP / libzend框架的PHP')   在/var/xyz.com/journey.php第12行

    当我执行xyz.com/journey/invite甚至xyz.com/journey

    修改

    这是一个许可问题,@ bool.dev建议将特定规则放在最佳工作上:)

1 个答案:

答案 0 :(得分:6)

这两个:

'journey/invite' => 'site/invite',
'journey/linkedin' => 'site/linkedin'

无效,因为该网址与之前的规则匹配:

'<controller:\w+>/<action:\w+>'=>'<controller>/<action>'

为了防止这种情况发生,只需确保最后提到规则,在任何特定的(即正则表达式不匹配)重写之前,所以你的规则看起来有点像这样:

'journey/invite' => 'site/invite',
'journey/linkedin' => 'site/linkedin',
'<controller:\w+>/<action:\w+>'=>'<controller>/<action>'

这个:\w+表示匹配任何字符串,其中包含一个或多个出现的任何“单词”字符(az 0-9 _),\d+表示匹配任何带有一个或多个出现的任何数字的字符串(0-9)。查看php regex

修改

之前没有彻底阅读过您的问题,规则中的controller只是匹配表达式的名称,因此您可能拥有'<contr:\w+>/<act:\w+>'=>'<contr>/<act>'

<强> EDIT2

使用rules数组 afaik 阅读您编辑过的问题后,您可以使用''=>'site/journey'代替'/'=>'site/journey'