1. 本地环境
nginx version: nginx/1.11.1
PHP 7.1.0-dev (cli)
mysql Ver 14.14 Distrib 5.7.22, for Linux (x86_64) using EditLine wrapper
2. 分析
- 原始路由形式:index.php?r=site/index
- 美化后路由形式:index.php/site/index
- 美化后需要配置
//config/main.php
'urlManager' => [
'enablePrettyUrl' => true,
'showScriptName' => false,
'rules' => [
],
],
//这个是yii2提供的路由美化配置
3. 美化原理
- yii2实现路由美化是通过urlManager组件实现,源码如下:
public function parseRequest($request)
{
if ($this->enablePrettyUrl) {
/* @var $rule UrlRule */
foreach ($this->rules as $rule) {
$result = $rule->parseRequest($this, $request);
if (YII_DEBUG) {
Yii::debug([
'rule' => method_exists($rule, '__toString') ? $rule->__toString() : get_class($rule),
'match' => $result !== false,
'parent' => null,
], __METHOD__);
}
if ($result !== false) {
return $result;
}
}
if ($this->enableStrictParsing) {
return false;
}
Yii::debug('No matching URL rules. Using default URL parsing logic.', __METHOD__);
$suffix = (string) $this->suffix;
$pathInfo = $request->getPathInfo();
$normalized = false;
if ($this->normalizer !== false) {
$pathInfo = $this->normalizer->normalizePathInfo($pathInfo, $suffix, $normalized);
}
if ($suffix !== '' && $pathInfo !== '') {
$n = strlen($this->suffix);
if (substr_compare($pathInfo, $this->suffix, -$n, $n) === 0) {
$pathInfo = substr($pathInfo, 0, -$n);
if ($pathInfo === '') {
// suffix alone is not allowed
return false;
}
} else {
// suffix doesn't match
return false;
}
}
if ($normalized) {
// pathInfo was changed by normalizer - we need also normalize route
return $this->normalizer->normalizeRoute([$pathInfo, []]);
}
return [$pathInfo, []];
}
Yii::debug('Pretty URL not enabled. Using default URL parsing logic.', __METHOD__);
$route = $request->getQueryParam($this->routeParam, '');
if (is_array($route)) {
$route = '';
}
return [(string) $route, []];
}
- 以上代码显示如果开启了路由美化原始路由就不可以用了,我们如果想实现美化路由与原始路由都可以访问,就需要重写urlManager组件类中的这个方法,在componets文件夹新建类urlManaer并重写上面这个方法代码如下:
<?php
/**
* Created by PhpStorm.
* User: gift
* Date: 2018/12/29
* Time: 14:50
*/
namespace commoncomponents;
class urlManager extends yiiwebUrlManager
{
/**
* 解析请求路由
* 同时支持 URL 原始和美化的请求解析
*
* @param yiiwebRequest $request
* @return array|bool
*/
public function parseRequest($request)
{
$route = trim($request->get($this->routeParam));
$enablePrettyUrl = $this->enablePrettyUrl;
if( $route != '' ) $this->enablePrettyUrl = false;
$result = parent::parseRequest($request);
if( $route != '' ) $this->enablePrettyUrl = $enablePrettyUrl;
return $result;
}
}
'urlManager' => [
'class' => 'commoncomponentsurlManager',
'enablePrettyUrl' => true,
'showScriptName' => false,
'rules' => [
],
],
- 至此就实现了原始路由与美化路由都可以访问了,当然还可以隐藏index.php入口脚本