1、Yii Url美化,配置urlManager組件php
'urlManager' => [ 'enablePrettyUrl' => true, // 開啓URL美化,能夠去掉 index.php?r=
'showScriptName' => false, // 若是設置爲 true,會顯示 index.php
'suffix' => '.html', // 實現僞靜態
'rules' => [ // 在 rules 中設置自定義規則
'<controller:\w+>/<id:\d+>' => '<controller>/detail',
'<controller:\w+>/<id:\d+>/<action:(create|update|delete)>' => '<controller>/<action>', // 在控制器和動做之間是 id 的值
'<controller:(post|comment)>s' => '<controller>/index', // 右邊post和comment index 的動做 均可以用左邊控制器ID加上 s 來代替
'posts' => 'post/index', // 若是訪問 post/index 顯示爲 posts.html
], ],
'<controller:\w+>/'<id:\d+> => '<controller>/detail' 詳解:
當url出現由若干字符 + / + 若干個數字來組成字符串的時候,urlManager 就會來判斷這個字符串是否匹配規則左邊的正則表達式,若是能匹配的話,這個字符串就會被轉換成爲規則右邊的這種樣式,在 controller後面跟上 /detail這個字符串,
而後把規則左邊的 id 已經若干的數字以參數的形式跟在動做的後面。
轉換詳情:
例如:www.example.com/post/42.html 在規則 suffix => .html的做用下轉換爲:
www.example.com/post/42 在規則'<controller:\w+>/'<id:\d+> => '<controller>/detail'的做用下轉換爲:
www.example.com/post/detail?id=42 在規則 'enablePrettyUrl' => true的做用下轉換爲:
www.example.com/index.php?r=post/detail?id=42
最後這個 url 就是完整路徑
2、createUrl()方法
一、UrlManager 組件的createUrl方法能夠建立各類類型的url連接
二、能夠把路由和要傳遞的參數做爲 createUrl 方法的參數進行建立
三、可以自動轉換爲符合URL美化規則的連接
使用示例:html
// url格式爲:index.php?r=site%2Findex¶m1=value1¶m2=value2 Yii::$app->urlManager->createUrl(['site/index','param1'=>'value1','param2'=>'value2']); // url格式爲:index.php?r=site%2Findex¶m1=value1#name Yii::$app->urlManager->createUrl(['site/index','param1'=>'value1','#'=>'name']); 路由 參數 錨點
記住,代碼中,必定要注意儘可能不要使用硬編碼web
3、url助手類
一、yii\helpers\Url::to()來建立各類類型的url連接
二、能夠把路由和要傳遞的參數做爲url助手類方法的參數來進行建立正則表達式
// index.php?r=post%2Findex
echo Url::to(['post/index']); // index.php?r=post%2Fview&id=100
echo Url::to(['post/view','id'=>100]); // index.php?r=post%2Fview&id=100#content
echo Url::to(['post/view','id'=>100,'#'=>'content']); // index.php?r=post%2Findex
echo Url::to(['post/index'],true); // 建立一個硬連接 // https//:www.example.com/index.php?r=post%2Findex
echo Url::to(['post/index'],'https'); // 建立含有https的url
4、虛擬主機URL美化
在項目根目錄新建一個 .htacces 的文件
將重寫規則寫入 .htacces 文件
例如寫入下面這一段:app
# use mod_rewrite for pretty URL support
RewriteEngine on # If a directory or a file exists, use the request directly
RewriteCond %{REQUEST_FILENAME} !-f RewriteCond %{REQUEST_FILENAME} !-d # Otherwise forward the request to index.php
RewriteRule . index.php # use index.php as index file
DirectoryIndex index.php # ...other settings... # Apache 2.4
Require all granted ## Apache 2.2 # Order allow,deny # Allow from all
httpd.conf須要改成以下:frontend
<VirtualHost *:80> ServerName frontend.test // 設置虛擬主機名
DocumentRoot "/path/to/yii-application/frontend/web/" // 虛擬主機的web根目錄
<Directory "/path/to/yii-application/frontend/web/"> AllowOverride All //容許 .htacces 文件覆蓋重寫規則
</Directory>
</VirtualHost>
這種狀況是在 虛擬主機不準給咱們修改的時候使用,可是Apache服務的配置必須能被覆蓋才行。