首页 文章

Yii基本url重写

提问于
浏览
1

我是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个文件 .

  • 'journey',

  • 'invite',

  • 'linkedin'

现在,我的主页应该重定向到“旅程”操作(即应该打开'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'是什么意思?

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

Edited after bool.dev's suggestion:

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

'/' => '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)不在允许的路径中:(/ 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):无法打开流:第12行/var/xyz.com/journey.php中不允许操作致命错误:require_once() :打开失败'/var/xyz.com/../yii/framework/yii.php'(include_path =' . :/ usr / share / php:/ usr / share / php / libzend-framework-php')在/var/xyz.com/journey.php第12行'

当我做 xyz.com/journey/invite 甚至 xyz.com/journey

Edit:

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

1 回答

  • 6

    这两个:

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

    因为url与之前的规则匹配而无法正常工作:

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

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

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

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

    Edit

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

    Edit2

    在使用rules数组读取您编辑的问题后,您可以使用 ''=>'site/journey' 而不是 '/'=>'site/journey' .

相关问题