手机浏览 RSS 2.0 订阅 膘叔的简单人生 , 腾讯云RDS购买 | 超便宜的Vultr , 注册 | 登陆
浏览模式: 标准 | 列表2011年08月19日的文章

一个疏忽引发的血案

这是一个PHP的函数,可以把相对路径转为绝对路径。比如可以把http://www.neatstudio.com/archive/../upload/xxx.jpg,转换成http://www.neatstudio.com/upload/xxx.jpg

PHP代码
  1. function getRealUrl($url) {  
  2.         $path = parse_url($url, PHP_URL_PATH);  
  3.         $patharr = explode("/"$path);  
  4.         $newarr = array();  
  5.         $i = 0;  
  6.         foreach ($patharr as $k => $val) {  
  7.             if ($k != 0 && !$val) {  
  8.                 continue;  
  9.             }  
  10.             if ($val == '..' && count($newarr) > 1) {  
  11.                 unset($newarr[$i - 1]);  
  12.                 $i--;  
  13.                 continue;  
  14.             }  
  15.             $newarr[$i] = $val;  
  16.             $i++;  
  17.         }  
  18.         $newpath = join("/"$newarr);  
  19.         return str_replace($path$newpath$url);  
  20.     }  

正常情况下,都没什么问题。但某一天,居然遇到了这样的网址:http://neatstudio.com/xxx/xxx/../0/abc.jpg,于是就出错了,返回成http://neatstudio.com/xxx/abc.jpg
细心的朋友可能发现了上面的问题,/0这个目录不见了。这是为什么呢??

居然是因为第7行 ,我对$val的判断是!$val。。。它认为0目录是不为真就跳过了。TNND,所以我改成了$val == '',真纠结。

粗心啊(请不要纠结上面的代码。花10分钟写的东西,质量不高是肯定的。)