关于path_info开启时url进一步美化的一种简单方法

#1 llx1216

url的美化对于一个严谨的web系统来讲确实是一个非常重要的部分,speedphp在path_info开启的时候相对于传统的url组织方式来讲达到了一定的美化效果,比如我自己的speedphp是部署在了根目录下的speedphp目录中,自己写了一个topic控制器,调用里面的show动作并且跟两个参数的话的话通过
<{spUrl c=topic a=show aid=3 cid=5}>生成
传统的url就是http://localhost/speedphp/index.php?c=topic&a=show&aid=3&cid=5 ,如果开启了path_info那么url就变成了http://localhost/speedphp/index.php/topic/show/aid/3/cid/5 比上面的看着舒服多了,但仔细看着觉得还不完美,一是url里面还带着一个index.php,很少有这样用的,二是aid/3/cid/5很明显的参数对应,也不爽,不够简洁,相当于仅仅是把?和&换成了/而已,如果把这两个问题都给就解决了,那么上面的url就可以成为http://localhost/speedphp/index/topic/show/3/5 的形式,如果是在根目录就成了http://localhost/index/topic/show/3/5 完全看不出php的痕迹,也让别人看不出参数的对应,非常简洁,看着舒服、漂亮。通过apache的rewrite模块可以生成强大的url映射,但其复杂性一般人看上几眼估计就直接头晕了,本人对于php也不是特别精通,这里提供一种简便的方法,通过.htaccess或apache的设置来实现,首先在speedphp所在根目录建立.htaccess文件,配置代码为

ForceType application/x-httpd-php

DirectoryIndex index index.php index.html
然后将speedphp的index.php文件重命名,去掉.php的后缀名,即变成了index,此配置代码的意思就是把index文件当成php程序来处理,并且添加其为索引,然后配置index
define("SP_PATH",dirname(__FILE__)."/SpeedPHP");
define("APP_PATH",dirname(__FILE__));
$spConfig = array(  
         'url' => array(  
         'url_path_base' => "/speedphp/index",     //此处根据个人的目录配置
     ),      
);
require(SP_PATH."/SpeedPHP.php");
spRun();
?>
然后配置SpeedPHP目录下的spConfig.php
'url' => array(    // URL设置
  'url_path_info' => TRUE,     // 是否使用path_info方式的URL
  'url_path_base' => './index',     // 我是部署在了二级目录中,根目录的话就用默认的
),
到这里就完成了第一步,让index来代替index.php,然后就是解决参数传递的问题了,首先在使用spUrl组织url的时候就得做些改动了,在smarty中写成这种形式xxxxx其中的<{$aid}>和<{$cid}>就是你要传递的参数了,这样生成的url就是http://localhost/speedphp/index/topic/show/3/5 这种形式的了,接下来就是要把/3/5和aid、cid对应起来了,首先写一个公共函数
function reurl($con,$i)
  {
  $item=0;  
  $fields = explode('/', $_SERVER['REQUEST_URI']);
  $id_pos = array_search($con, $fields);
  if($id_pos)
  {
    $item = $fields[ $id_pos + $i +1];
  }
  return $item;
  }
其中的两个参数$con就是当前控制器的名称,$i就是代表url中自己要传递的第几个参数
如果要把这两个参数和aid、cid分别对应起来就可以通过
$aid=$this->reurl('topic',1);
$cid=$this->reurl('topic',2);
来获得,然后再怎么做就不用我说了吧,不同的控制器、更多参数无非就改变一下这两个参数就可以了


最后我想说,自己水平非常有限,这可能只是一个不大成熟的做法,我不知道有没有更好更简便的办法,它会牺牲一定的性能,而且如果关闭了path_info或是.htaccess不能使用自己又无权配置apache时,这种方法就不行了,模板中的url组织也会出错,这里我只是想交流这样一种方法,不知道适合不适合在实际开发中大范围的使用了,还望各位多多指教


2011-02-20 23:43:56

#2 jake的马甲

请看SpeedPHP的伪静态UrlRewrite实现
http://speedphp.com/post/urlrewrite.html

2011-02-21 16:37:55

#3 jacob_cyl

jake的马甲 发表于 2011-2-21 16:37
请看SpeedPHP的伪静态UrlRewrite实现
http://speedphp.com/post/urlrewrite.html
怎么那么多页面不可访问的?

2012-10-12 16:21:08

#4 jacob_cyl

jake的马甲 发表于 2011-2-21 16:37
请看SpeedPHP的伪静态UrlRewrite实现
http://speedphp.com/post/urlrewrite.html
20121012162210.jpg

2012-10-12 16:22:40

#5 lhabc

标注,以备用

2012-10-16 23:04:22

#6 jake

jacob_cyl 发表于 2012-10-12 16:22
有时间处理一下{:soso_e181:}

2012-10-17 07:20:09