PHP Yii中的路由是如何工作的?

PHP Yii中的路由是如何工作的?,php,yii,routing,Php,Yii,Routing,我来自Rails和codeIgniter的背景,我习惯于看到routes.rb或routes.php,但是在阅读Yii框架中的一些文档时,我无法理解路由是如何工作的?是否由配置文件自动完成?如果是的话,那怎么办 查看main.php配置文件,我相信以下几行可以创造奇迹: 'urlManager'=>array( 'urlFormat'=>'path', 'rules'=>array( '<controller

我来自Rails和codeIgniter的背景,我习惯于看到routes.rb或routes.php,但是在阅读Yii框架中的一些文档时,我无法理解路由是如何工作的?是否由配置文件自动完成?如果是的话,那怎么办

查看main.php配置文件,我相信以下几行可以创造奇迹:

    'urlManager'=>array(
        'urlFormat'=>'path',
        'rules'=>array(
            '<controller:\w+>/<id:\d+>'=>'<controller>/view',
            '<controller:\w+>/<action:\w+>/<id:\d+>'=>'<controller>/<action>',
            '<controller:\w+>/<action:\w+>'=>'<controller>/<action>',
        ),
    ),
'urlManager'=>数组(
“urlFormat'=>“路径”,
'规则'=>数组(
“/”=>“/视图”,
'//'=>'/',
'/'=>'/',
),
),
然而,为什么控制器标签中有一个w+?id标签是如何工作的

为什么url必须以index.php开头?为什么不能简单地说呢
localhost/controllername/action?

首先,这里有一个很好的指南:

为了回答您的问题(或其中一些问题),您粘贴的行基本上告诉Yii如何处理这些“漂亮”URL,例如,它需要一个控制器名称,然后是一个id(d+表示数字),然后它将路由到控制器/视图

还请注意,控制器和操作有命名约定,例如UserController、actionView()

关于index.php问题,这是Nginx/apachehtaccess的工作,在CodeIgniter中也应该是一样的

希望这有帮助


另外,你可以在这里阅读更多关于URL的信息

欢迎来到Yii!URL管理器非常强大,你可以让它做任何你需要的事情

URL不必以
index.php
开头-请尝试以下设置:

'urlManager'=>array(
    'showScriptName' => false, // Removes index.php from URL
    'urlFormat'=>'path',       // Uses /controller/action rather than query vars
    'useStrictParsing'=>true,  // Prevents generic rule matching
    'rules'=>array(
    ),
),
至于规则中的
+w
,这是Regex——或者说是Yii对Regex的基本版本。您可以在管线中设置参数,使其仅与某些正则表达式模式匹配:

// URL /articles/an-article-321 routed to ArticleController and ActionView Method
// I'm setting up the params $_GET['slug'] and $_GET['id']
 'articles/<slug:[a-z-]+>-<id:\d+>' => 'article/view' 
//URL/articles/an-article-321路由到ArticleController和ActionView方法
//我正在设置参数$\u GET['slug']和$\u GET['id']
“文章/-”=>“文章/视图”

添加showScriptName=>false似乎会使我的所有链接都断开?您是在手动构建链接,包括
index.php/which
还是在使用
CHtml::link()
Controller::createUrl()
?后者将在您更改规则时更新。你也在使用.htaccess文件重写你所有的URL吗?我只是创建了自动生成的应用程序,它有一些链接。在阅读了一篇关于删除index.php和路由的文章后,我了解到在我的情况下,.htaccess文件必须放在项目www/testdrive的根目录下。该文件必须包含。然而,看起来现在链接指向localhost/site/action,这很好,但它们都返回404。如果我使用localhost/index.php/site/action,那么在添加.htaccess之后,它们也能正常工作。看起来服务器返回了500个内部错误。您需要日志吗?如果您得到的是500,则.htaccess文件中一定存在某种语法错误或权限问题。