web编程之路代码改变世界程序猿阵线联盟-汇总各类技术干货

php关于$_SERVER中一些和环境有关的参数详解

2016-10-26  本文已影响124人  hopevow

前面有一个关于$_SERVER的文档,今天,来看看怎么不同环境下其携带参数的差异与统一。

在yii2中的一个方法:用来获取不同环境下统一的URI

<?php
//使用了ISAPI_Rewrite的IIS
if (isset($_SERVER['HTTP_X_REWRITE_URL'])) {
    $requestUri = $_SERVER['HTTP_X_REWRITE_URL'];
//一般情况,需要去掉 URL 中的协议、主机、端口等内容
} elseif (isset($_SERVER['REQUEST_URI'])) {
    $requestUri = $_SERVER['REQUEST_URI'];
    if ($requestUri !== '' && $requestUri[0] !== '/') {
        $requestUri = preg_replace('/^(http|https):\/\/[^\/]+/i', '', $requestUri);
    }
// IIS 5.0, PHP 以 CGI 方式运行,需要把查询参数接上
} elseif (isset($_SERVER['ORIG_PATH_INFO'])) {
    $requestUri = $_SERVER['ORIG_PATH_INFO'];
    if (!empty($SERVER['QUERY_STRING'])) {
        $requestUri .= '?' . $SERVER['QUERY_STRING'];
    }
} else {
    throw new Exception('wrong');
}

echo $requestUri;
fastcgi_split_path_info ^(.+?\.php)(/.*)$;
# 使用 document root 来得到物理路径
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name

再来看看yii2中的相关方法:

<?php
$scriptFile = $_SERVER['SCRIPT_FILENAME'];
$scriptName = basename($scriptFile);

if (basename($_SERVER['SCRIPT_NAME']) === $scriptName){
    $_scriptUrl = $_SERVER['SCRIPT_NAME'];
} elseif (basename($_SERVER['PHP_SELF']) === $scriptName) {
    $_scriptUrl = $_SERVER['PHP_SELF'];
} elseif (isset($_SERVER['ORIG_SCRIPT_NAME']) && basename($_SERVER['ORIG_SCRIPT_NAME']) === $scriptName) {
    $_scriptUrl = $_SERVER['ORIG_SCRIPT_NAME'];
} elseif (!empty($_SERVER['DOCUMENT_ROOT']) && strpos($scriptFile, $_SERVER['DOCUMENT_ROOT']) === 0) {
    $_scriptUrl = str_replace("\\", '/', str_replace($_SERVER['DOCUMENT_ROOT'], '', $scriptFile));
} else {
    throw new Exception ('wrong');
}

$baseUrl = retirm(dirname($_scriptUrl), '\\/');

在yii中通过这些的配合,也有一个获取pathinfo的方法,如下是逻辑代码:

$pathinfo = $requestUri;

if (($pos = strpos($pathinfo , '?')) !== false) {
    $pathinfo = substr($pathinfo, 0, $pos);
}

if (!preg_match('%^(?:
    [\x09\x0A\x0D\x20-\x7E] # ASCII
    | [\xC2-\xDF][\x80-\xBF] # non-overlong 2-byte
    | \xE0[\xA0-\xBF][\x80-\xBF] # excluding overlongs
    | [\xE1-\xEC\xEE\xEF][\x80-\xBF]{2} # straight 3-byte
    | \xED[\x80-\x9F][\x80-\xBF] # excluding surrogates
    | \xF0[\x90-\xBF][\x80-\xBF]{2} # planes 1-3
    | [\xF1-\xF3][\x80-\xBF]{3} # planes 4-15
    | \xF4[\x80-\x8F][\x80-\xBF]{2} # plane 16
    )*$%xs', $pathinfo)
) {
    $pathInfo = utf8_encode($pathInfo);
}

if (strpos($pathinfo, $_scriptUrl) === 0) {
    $pathinfo = substr($pathinfo, strlen($_scriptUrl));
} elseif ($baseUrl === "" || strpos($pathinfo, $baseUrl) === 0) {
    $pathinfo = substr($pathinfo, strlen($baseUrl));
} elseif (isset($_SERVER['PHP_SELF']) && strpos($_SERVER['PHP_SELF'], $_scriptUrl) === 0) {
    $pathinfo = substr($_SERVER['PHP_SELF'], str($_scriptUrl));
} else {
    throw new Exception('wrong');
}
if ($pathinfo[0] === '/') {
    $pathinfo = substr($pathinfo, 1);
}

这样,就获得了当前请求的URI($requestUri)、脚本路径($_scriptUrl)、pathinfo($pathinfo),这些变量都是一个健壮的框架所需利用的元素。

上一篇 下一篇

猜你喜欢

热点阅读