一、resolve方法,解析请求,返回路由和参数。
/**
* 解析请求,
* 返回路由和参数
*/
public function resolve()
{
//解析请求,返回路由和参数
$result = Yii::$app->getUrlManager()
->parseRequest($this);
if ($result !== false) {
list($route, $params) = $result;
if ($this->_queryParams === null) {
// 保留数字键
// 这里注意 使用 '+ ' 和 array_merge函数的区别
$_GET = $params + $_GET;
} else {
$this->_queryParams = $params + $this->_queryParams;
}
//getQueryParams方法
// 1. $this->_queryParams === null 返回 $_GET
// 2. 否则,返回 $this->_queryParams
return [$route, $this->getQueryParams()];
}
//404错误
throw new NotFoundHttpException(Yii::t('yii', 'Page not found.'));
}
二、filterHeaders方法,过滤头
/**
* 根据trustedHosts过滤头
*/
protected function filterHeaders(HeaderCollection $headerCollection)
{
$trustedHeaders = $this->getTrustedHeaders();
// 遍历过滤安全头
foreach ($this->secureHeaders as $secureHeader) {
if (!in_array($secureHeader, $trustedHeaders)) {
$headerCollection->remove($secureHeader);
}
}
}
三、getTrustedHeaders方法,返回信任头列表
/**
* 返回信任头列表
*/
protected function getTrustedHeaders()
{
// 默认情况下不相信任何secureHeaders
$trustedHeaders = [];
// 检查主机
if (!empty($this->trustedHosts)) {
//ip验证器
$validator = $this->getIpValidator();
//客户端ip
$ip = $this->getRemoteIP();
foreach ($this->trustedHosts as $cidr => $headers) {
if (!is_array($headers)) {
$cidr = $headers;
$headers = $this->secureHeaders;
}
//设置ip返回
$validator->setRanges($cidr);
//验证ip
if ($validator->validate($ip)) {
$trustedHeaders = $headers;
break;
}
}
}
return $trustedHeaders;
}
四、getIpValidator方法,返回IpValidator实例
// 返回IpValidator实例
protected function getIpValidator()
{
return new IpValidator();
}
五、getHeaders方法,返回过滤后的头列表
/**
* 返回过滤后header集合
*/
public function getHeaders()
{
if ($this->_headers === null) {
//实例化
$this->_headers = new HeaderCollection();
if (function_exists('getallheaders')) {
//getallheaders函数从当前请求中获取所有HTTP头。
//getallheaders函数是apache_request_headers的别名
$headers = getallheaders();
foreach ($headers as $name => $value) {
//向集合中添加
$this->_headers->add($name, $value);
}
} elseif (function_exists('http_get_request_headers')) {
//http_get_request_headers返回请求头的关联数组
$headers = http_get_request_headers();
foreach ($headers as $name => $value) {
$this->_headers->add($name, $value);
}
} else {
// ['prefix' => length]
$headerPrefixes = ['HTTP_' => 5, 'REDIRECT_HTTP_' => 14];
foreach ($_SERVER as $name => $value) {
foreach ($headerPrefixes as $prefix => $length) {
if (strncmp($name, $prefix, $length) === 0) {
//下面一系列操作转化流程:HTTP_USER_AGENT
// 1. USER_AGENT
// 2. USER AGENT
// 3. user agent
// 4. User Agent
// 5. User-Agent
$name = str_replace(// 将' '替换成'-'
' ', '-',
ucwords( // 将每个单词的首字母转换成大写
strtolower( // 转换成小写
str_replace('_', ' ', // 将 '-' 替换成 ' '
substr($name, $length) // 获得子串
)
)
)
);
//添加到集合
$this->_headers->add($name, $value);
//跳出两层循环,继续下一次循环
continue 2;
}
}
}
}
//过滤头,移除不安全的头
$this->filterHeaders($this->_headers);
}
return $this->_headers;
}
总结:
阅读了5个方法:
- resolve方法,解析请求,返回路由和参数
- filterHeaders方法,过滤头
- getTrustedHeaders方法,返回信任头列表
- getIpValidator方法,返回IpValidator实例
- getHeaders方法,返回过滤后的头列表