| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145 | <?php/** * FecShop file. * * @link http://www.fecshop.com/ * @copyright Copyright (c) 2016 FecShop Software LLC * @license http://www.fecshop.com/license/ */namespace fecshop\yii\web;use Yii;use yii\base\InvalidConfigException;/** * rewrite class \yii\web\Request * use custom url in our system, example: www.example.com/xxxxx.html, this file is not * exit in our system, In order to consider SEO, we can use db storage  map between custom url and yii url * when request visit /xxxx.html, select this custom url in mongodb, return the yii url ,ex.  /product/index?_id=3 * then , resolve /product/index?_id=3 . * @author Terry Zhao <2358269014@qq.com> * @since 1.0 */class Request extends \yii\web\Request{    /**     * rewrite yii\web\Request  resolveRequestUri().     */    protected function resolveRequestUri()    {        if (isset($_SERVER['HTTP_X_REWRITE_URL'])) { // IIS            $requestUri = $_SERVER['HTTP_X_REWRITE_URL'];        } elseif (isset($_SERVER['REQUEST_URI'])) {            $requestUri = $_SERVER['REQUEST_URI'];            if ($requestUri !== '' && $requestUri[0] !== '/') {                $requestUri = preg_replace('/^(http|https):\/\/[^\/]+/i', '', $requestUri);            }        } elseif (isset($_SERVER['ORIG_PATH_INFO'])) { // IIS 5.0 CGI            $requestUri = $_SERVER['ORIG_PATH_INFO'];            if (!empty($_SERVER['QUERY_STRING'])) {                $requestUri .= '?' . $_SERVER['QUERY_STRING'];            }        } else {            throw new InvalidConfigException('Unable to determine the request URI.');        }        /*         * Replace Code         * //return $requestUri;         * To:         */        return $this->getRewriteUri($requestUri);    }    /**     * get module request url by db ;.     */    protected function getRewriteUri($requestUri)    {        $baseUrl = $this->getBaseUrl();        $requestUriRelative = $requestUri;        if ($baseUrl) {            $requestUriRelative = substr($requestUriRelative, strlen($baseUrl));        }        $urlKey = '';        $urlParam = '';        $urlParamSuffix = '';        // 从url中解析出来 urlKey部分,参数部分,已经#后面的部分        if (strstr($requestUriRelative, '#')) {            list($urlNoSuffix, $urlParamSuffix) = explode('#', $requestUriRelative);            if (strstr($urlNoSuffix, '?')) {                list($urlKey, $urlParam) = explode('?', $urlNoSuffix);            }        } elseif (strstr($requestUriRelative, '?')) {            list($urlKey, $urlParam) = explode('?', $requestUriRelative);        } else {            $urlKey = $requestUriRelative;        }        if ($urlParamSuffix) {            $urlParamSuffix = '#'.$urlParamSuffix;        }        // 通过上面解析的urlKey,传入到:Yii::$service->url->getOriginUrl($urlKey)        // 得到原来的url key,这样,我们将自定义的url key,通过查询的方式,找到Yii2框架的url key        if (Yii::$service->url->showScriptName) {            $urlKey = str_replace('/index.php', '', $urlKey);            $originUrlPath = Yii::$service->url->getOriginUrl($urlKey);        } else {            $originUrlPath = Yii::$service->url->getOriginUrl($urlKey);        }        //echo $urlKey;        //echo $originUrlPath;        //exit;        if ($originUrlPath) {            if (strstr($originUrlPath, '?')) {                if ($urlParam) {                    $url = $originUrlPath.'&'.$urlParam.$urlParamSuffix;                } else {                    $url = $originUrlPath.$urlParamSuffix;                }                $this->setRequestParam($originUrlPath);            } else {                if ($urlParam) {                    $url = $originUrlPath.'?'.$urlParam.$urlParamSuffix;                } else {                    $url = $originUrlPath.$urlParamSuffix;                }            }            return $baseUrl.$url;        } else {            return $requestUri;        }    }    /**     * after get urlPath from db, if urlPath has get param ,     * set the param to $_GET.     */    public function setRequestParam($originUrlPath)    {        $arr = explode('?', $originUrlPath);        $yiiUrlParam = $arr[1];        $arr = explode('&', $yiiUrlParam);        foreach ($arr as $a) {            list($key, $val) = explode('=', $a);            $_GET[$key] = $val;        }    }    /*     *  mongodb url_rewrite collection columns: _id,  type ,custom_url, yii_url,     *	if selete date from UrlRewrite, return the yii url.     */    /*    protected function getOriginUrl($urlKey){        $UrlData = UrlRewrite::find()->where([            'custom_url_key' => $urlKey,        ])->asArray()->one();        if($UrlData['custom_url_key']){            return $UrlData['origin_url'];        }        return ;    }    */}
 |