Yii2漂亮网址:使用斜杠自动转换所有内容(包括所有参数)

Gyt*_*mas 7 php url .htaccess yii yii2

我正在使用Yii2,我想使用带路由的urlManager将所有非字母和非数字字符转换为斜杠.我已经看了很多问题(#1,#2,#3,#4)但是没有解决它,因为它们要么显示有点相似但不是我想要的或根本不为我工作.

我有简单的urlManager规则:

//...
'urlManager' => [
    'class' => 'yii\web\UrlManager',
    'enablePrettyUrl' => true,
    'showScriptName' => false,
    'rules' => array(
        '<controller:\w+>/<id:\d+>' => '<controller>/view',
        '<controller:\w+>/<action:\w+>/<id:\d+>' => '<controller>/<action>',
        '<controller:\w+>/<action:\w+>' => '<controller>/<action>',
    ),
],
Run Code Online (Sandbox Code Playgroud)

.htaccess(也很简单):

RewriteEngine on
# If a directory or a file exists, use it directly
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
# Otherwise forward it to index.php
RewriteRule . index.php
Run Code Online (Sandbox Code Playgroud)

在我的情况下,我的丑陋URL是this(SiteController -> public function actionTestRouter()):

本地主机/前端/网络/的index.php?R =站点%2Ftest路由器&IDENT = 10&标记= ADB&模块P120 =

根据我上面写的规则,我得到了更好的结果(因为它删除index.php?r=并转换%2F为/):

本地主机/前端/网络/站点/测试路由器?IDENT = 10&标记= ADB&模块P120 =

我想得到什么:

本地主机/前端/网络/站点/测试路由器/ IDENT/10 /令牌/ ADB /模块/ P120

我对规则的几个尝试是:

'test-route/<ident:\d+>/<token:\w+>/<module:\w+>' => 'test-route' // 1
'<controller:\w+>/<action:\w+>/<ident:\d+>/<token:\w+>/<module:\w+>' => '<controller>/<action>' // 2
'<controller:\w+>/<action:\w+>/<slug:[a-zA-Z0-9_-]+>/' => '<controller>/<action>/<slug>' // 3 (not even sure what slug does here
Run Code Online (Sandbox Code Playgroud)

如果规则适用于任何参数和值,无论其名称和值如何,这也将是非常好的.

use*_*788 6

你的第二次尝试

'<controller:[\w\-]+>/<action:[\w\-]+>/<ident:\d+>/<token:\w+>/<module:\w+>' => '<controller>/<action>' // 2
Run Code Online (Sandbox Code Playgroud)

将采取/创建网址

本地主机/前端/网页/网站/测试路由器/ 10/ADB/P120

在url中没有params的名称,这些params将仅按此顺序使用,并且它们的列表是固定的,如您所见

如果你想在url中添加他们的名字(如你问题中的estetic或seo目的):

'<controller:[\w\-]+>/<action:[\w\-]+>/ident/<ident:\d+>/token/<token:\w+>/module/<module:\w+>' => '<controller>/<action>',  // 2
Run Code Online (Sandbox Code Playgroud)

这些路线的网址创建将是相同的:

echo Url::to(['site/test-router', 'ident' => 100, 'module' => 100, 'token' => 100]);
Run Code Online (Sandbox Code Playgroud)

如果你想解析这个params列表的各种长度,你可以像这样使用smth:

'<controller:[\w\-]+>/<action:[\w\-]+>/<params:[a-zA-Z0-9_\-\/]+>' => '<controller>/<action>'
Run Code Online (Sandbox Code Playgroud)

或仅为一条路线指定:

'site/test-route/<params:[a-zA-Z0-9_\-\/]+>' => 'site/test-route'
Run Code Online (Sandbox Code Playgroud)

所以在操作中你将得到参数params:Yii::$app->request->get('params');用regexp解析它.