Yii基本url重写

Jas*_*ant 1 url-rewriting url-routing yii

我是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,
Run Code Online (Sandbox Code Playgroud)

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

  1. '旅程',
  2. '邀请',
  3. 'LinkedIn'

现在,我的主页应该重定向到"旅程"操作(即应该打开'site/journey.php')

所以,我猜,这将是

'/' => 'site/journey'
Run Code Online (Sandbox Code Playgroud)

它也有效.

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

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

但,

'journey/invite' => 'site/invite',
'journey/linkedin' => 'site/linkedin'
Run Code Online (Sandbox Code Playgroud)

不管用.

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

<controller:\w+>/<id:\d+>
Run Code Online (Sandbox Code Playgroud)

即什么是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>', 
Run Code Online (Sandbox Code Playgroud)

但它会引发错误

"警告: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')in第12行的/var/xyz.com/journey.php'

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

编辑:

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

boo*_*dev 6

这两个:

'journey/invite' => 'site/invite',
'journey/linkedin' => 'site/linkedin'
Run Code Online (Sandbox Code Playgroud)

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

'<controller:\w+>/<action:\w+>'=>'<controller>/<action>'
Run Code Online (Sandbox Code Playgroud)

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

'journey/invite' => 'site/invite',
'journey/linkedin' => 'site/linkedin',
'<controller:\w+>/<action:\w+>'=>'<controller>/<action>'
Run Code Online (Sandbox Code Playgroud)

\w+意味着:将任何字符串与任何"单词"字符(az 0-9 _)的\d+一个或多个匹配项匹配,意味着将任何字符串与任何数字(0-9)的一个或多个匹配项匹配.看看php正则表达式.

编辑

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

EDIT2

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