2

我已经有一段时间了这个功能:

function fixLink($url){
    return preg_replace('@/[^/]+/\.\./@','/',$url);
}

它对变成:
http://domain.com/page/../index.html变成了奇迹,http://domain.com/index.html
但最近我不得不使用它:
http://domain.com/../index.html结果是http://index.html

在这种情况下,如何保护域名,使其将修复的链接输出为:http://domain.com/index.html

寻找有关如何解决问题的想法,请不要过度使用代码。

4

1 回答 1

3
function fixLink($url) {
    $parts = parse_url($url);
    if (empty($parts['path']) || empty($parts['scheme'])) {
        return $url;
    }
    $parts['path'] = preg_replace('@[^/]+/\.\./@', '', $parts['path']);
    $parts['path'] = preg_replace('@^/\.\./@', '/', $parts['path']);
    $parts['scheme'] .= '://';
    return implode('', $parts);
}

但是,以上并不能解决所有情况。更强大的版本是:

function fixLink($url) {
    $parts = parse_url($url);
    if (empty($parts['scheme']) || empty($parts['path'])) {
        return $url;
    }
    $path = array();
    foreach (explode('/', $parts['path']) as $i => $item) {
        if ($item == '..') {
            if (count($path) > 1) {
                array_pop($path);
            }
        } else {
            $path[] = $item;
        }    
    }
    $parts['scheme'] .= '://';
    $parts['path'] = implode('/', $path);
    return implode('', $parts);
}
于 2013-01-08T06:52:45.087 回答