【发布时间】:2016-11-02 03:04:56
【问题描述】:
我正在使用 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>',
),
],
.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
就我而言,我丑陋的网址是这样的 (SiteController -> public function actionTestRouter()):
localhost/frontend/web/index.php?r=site%2Ftest-router&ident=10&token=ADB&module=P120
使用我上面写的规则,我得到了更好的结果(因为它删除了index.php?r= 并将%2F 转换为/):
localhost/frontend/web/site/test-router?ident=10&token=ADB&module=P120
我想得到什么:
localhost/frontend/web/site/test-router/ident/10/token/ADB/module/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
如果规则适用于任何参数和值,不管它们的名称和值如何,那也太好了。
【问题讨论】:
-
非常感谢您的提问。这就是 Yii 1 默认设置为 urlManager 设置 urlFormat='Path' 的原因,Yii 2 在这方面退了一步,我看不出有什么问题有了它,我已经花了很多时间来弄清楚它。 Yii 1 的逻辑直接在类
CUrlManager -> parsePathInfo ($pathInfo)方法中。所以在 Yii 2 中,我们必须通过自己的实现或以某种方式从 Yii1 重用来克服 -
有趣的相关问题,但对于 Yii 1 ,虽然可能与通配符重复/乘法运算符相同的方式可以类似地完成 - stackoverflow.com/a/20429218/3419535 或类似用法 yii 2 食谱但仅用于乘法单个参数的值 - github.com/samdark/yii2-cookbook/blob/master/book/…
标签: php .htaccess url yii yii2