解决Typecho中文tag重定向问题

2017-05-19  |  技术  |  1482 views

  前几天发表了一篇文章,关于伪静态配置的,文章中有使用到中文的tag。然后昨天无聊点击了一下中文tag,发现它直接跳到了首页,而不是去到tag下的相关文章,而且,点击打开文章还是无限的重定向循环,根本打不开啊,这可把我急的,连夜修bug。但是,无奈代码太多,找了很久愣是没定位到问题,于是作罢。
  今天早上,我仍然不死心,到网上搜了搜,发现有个相关的文章,说是有可能跟var/Typecho/Request.php文件有关,于是便记下来,决定晚上回来继续搞。晚上回来看的时候,你别说,还真是有关系,主要是在获取请求地址getRequestUri()这个函数里面。以下是改之前的代码:

/**
 * 获取请求地址
 * 
 * @access public
 * @return string
 */
public function getRequestUri()
{
    if (!empty($this->_requestUri)) {
        return $this->_requestUri;
    }

    //处理requestUri
    $requestUri = '/';

    if (isset($_SERVER['HTTP_X_REWRITE_URL'])) { // check this first so IIS will catch
        $requestUri = $_SERVER['HTTP_X_REWRITE_URL'];
    } elseif (
        // IIS7 with URL Rewrite: make sure we get the unencoded url (double slash problem)
        isset($_SERVER['IIS_WasUrlRewritten'])
        && $_SERVER['IIS_WasUrlRewritten'] == '1'
        && isset($_SERVER['UNENCODED_URL'])
        && $_SERVER['UNENCODED_URL'] != ''
        ) {
        $requestUri = $_SERVER['UNENCODED_URL'];
    } elseif (isset($_SERVER['REQUEST_URI'])) {
        $requestUri = $_SERVER['REQUEST_URI']; //问题在这里
        if (isset($_SERVER['HTTP_HOST']) && strstr($requestUri, $_SERVER['HTTP_HOST'])) {
            $parts       = @parse_url($requestUri);

            if (false !== $parts) {
                $requestUri  = (empty($parts['path']) ? '' : $parts['path'])
                             . ((empty($parts['query'])) ? '' : '?' . $parts['query']);
            }
        }
    } elseif (isset($_SERVER['ORIG_PATH_INFO'])) { // IIS 5.0, PHP as CGI
        $requestUri = $_SERVER['ORIG_PATH_INFO'];
        if (!empty($_SERVER['QUERY_STRING'])) {
            $requestUri .= '?' . $_SERVER['QUERY_STRING'];
        }
    }

    return $this->_requestUri = $requestUri;
}

  看着代码好像是没什么问题,但是我仔细看了下浏览器的请求,http://www.junfai.cc/tag/%E4%BC%AA%E9%9D%99%E6%80%81/,tag后面的url参数是大写的,我试着把它转为小写,居然可以了,surprise!好吧,按照这个思路来的话,大概知道改哪里了。因为$_SERVER里面是有包含REQUEST_URI的,所以定位到第二个elseif条件那里,把$requestUri = $_SERVER['REQUEST_URI']; 改为$requestUri = strtolower($_SERVER['REQUEST_URI']) ; 就可以了(其实就是把REQUEST_URI参数转换为小写),完美解决。有时候,还真是得细心点才能发现问题啊,哈哈,最后还是解决了,希望这个能对大家有帮助吧。

发表新评论