将URL的某个参数值的改成另一个参数

来自:http://www.meedee.cn/2016/06/21/%e5%b0%86url%e5%8f%82%e6%95%b0%e8%bd%ac%e6%8d%a2%e4%b8%ba%e5%8f%a6%e4%b8%80%e4%b8%aa%e5%8f%82%e6%95%b0%e5%81%9a301%e8%b7%b3%e8%bd%ac%e7%9a%84%e5%ae%9e%e7%8e%b0/

将URL的某个参数值的改成另一个参数。

例如

http://xxx/Finance/lists?iid=202&sid=26 要改成 http://xxx/Finance/lists?iid=202&sid=31

先考虑用Thinkphp的路由规则,发现不能实现。因为只是匹配$_SERVER['PATH_INFO']的数据,不能获取查询参数。见http://php.net/manual/zh/reserved.variables.server.php
'PATH_INFO'
包含由客户端提供的、跟在真实脚本名称之后并且在查询语句(query string)之前的路径信息,如果存在的话。例如,如果当前脚本是通过 URL http://www.example.com/php/path_info.php/some/stuff?foo=bar 被访问,那么 $_SERVER['PATH_INFO'] 将包含 /some/stuff。

如果非要实现,就要改TP的这个方法啦。

public function run(&$return){
// 优先检测是否存在PATH_INFO
$regx = trim($_SERVER['PATH_INFO'],'/');
if(empty($regx)) return $return = true;
// 是否开启路由使用
if(!C('URL_ROUTER_ON')) return $return = false;
// 路由定义文件优先于config中的配置定义
$routes = C('URL_ROUTE_RULES');
// 路由处理
if(!empty($routes)) {
$depr = C('URL_PATHINFO_DEPR');
// 分隔符替换 确保路由定义使用统一的分隔符
$regx = str_replace($depr,'/',$regx);
foreach ($routes as $rule=>$route){
if(0===strpos($rule,'/') && preg_match($rule,$regx,$matches)) { // 正则路由
return $return = $this->parseRegex($matches,$route,$regx);
}else{ // 规则路由
$len1   =   substr_count($regx,'/');
$len2   =   substr_count($rule,'/');
if($len1>=$len2) {
if('$' == substr($rule,-1,1)) {// 完整匹配
if($len1 != $len2) {
continue;
}else{
$rule =  substr($rule,0,-1);
}
}
$match  =  $this->checkUrlMatch($regx,$rule);
if($match)  return $return = $this->parseRule($rule,$route,$regx);
}
}
}
}
$return = false;
}
那就通过htaccess来实现吧

参考:https://wiki.apache.org/httpd/RewriteQueryString

用Modifying the Query String来改下。
最终的这样子

RewriteBase /
RewriteCond %{QUERY_STRING} (.*(?:^|&))sid=26|27((?:&|$).*) 
RewriteRule ^Finance/lists /Finance/lists?%1sid=31 [L,R=301]

猜你喜欢

转载自lhdst-163-com.iteye.com/blog/2316861