tp系统, url分割符 改成使用"-" 后,原先使用 "/"作为分隔符的URL均不能访问,解决方案

来源:互联网 发布:店铺如何申请淘宝直播 编辑:程序博客网 时间:2024/06/10 05:35

背景:对一个使用 TP 3.2  开发的电商网站进行SEO优化,因部分原因以及为了减少工作量,方案是使用修改URL分隔符的方式进行全站URL换链,(即将 URL_PATHINFO_DEPR 的值 由 "/"换为 "-")

URL_PATHINFO_DEPR'     =>  '-',    // PATHINFO模式下,各参数之间的分割符号'

导致的问题是 :替换后的网站只支持 "-"  以及 "&args=XX"形式的URL,

                             由于电商运营推广,旧数据等因素,不能兼容旧的链接的开发优化是无意义的,所以对于网站兼容多种链接就非常必要

解决方案:

                           在入口文件 index.php中引入TP内核入口文件之前加上一个拦截过滤(目前在我本站调试可行的唯一方案),即在

require THINK_PATH . 'ThinkPHP.php';
之前加上 这段过滤代码 (注意必须在引入TP入口文件之前引入)

/*兼容 分隔符为"/"URL 支持分隔符为"-" "/" "&" URL*/$uri = ltrim($_SERVER['REQUEST_URI'], '/');if (strpos($uri, '/') !== false) {    $uri = str_replace('/', '-', $uri);    $_GET['s'] = $_SERVER['REQUEST_URI'] = $_SERVER['PATH_INFO'] = "/$uri";    $_SERVER['QUERY_STRING'] = "s=/$uri";}

加上这段代码之后,进入本站的链接都会被进行一次过滤,以支持 分隔符为 "/" 的URL的访问

附: 

详解 $_SERVER 函数中QUERY_STRING和REQUEST_URI区别

引用自:http://blog.sina.com.cn/s/blog_686999de0100jgda.html

1,http://localhost/aaa/ (打开aaa中的index.php)
结果:
$_SERVER['QUERY_STRING'] = "";
$_SERVER['REQUEST_URI']  = "/aaa/";
$_SERVER['SCRIPT_NAME']  = "/aaa/index.php";
$_SERVER['PHP_SELF']     = "/aaa/index.php";

2,http://localhost/aaa/?p=222 (附带查询)
结果:
$_SERVER['QUERY_STRING'] = "p=222";
$_SERVER['REQUEST_URI']  = "/aaa/?p=222";
$_SERVER['SCRIPT_NAME']  = "/aaa/index.php";
$_SERVER['PHP_SELF']     = "/aaa/index.php";

3,http://localhost/aaa/index.php?p=222&q=333
结果:
$_SERVER['QUERY_STRING'] = "p=222&q=333";
$_SERVER['REQUEST_URI']  = "/aaa/index.php?p=222&q=333";
$_SERVER['SCRIPT_NAME']  = "/aaa/index.php";
$_SERVER['PHP_SELF']     = "/aaa/index.php";

由实例可知:
$_SERVER["QUERY_STRING"]  获取查询 语句,实例中可知,获取的是?后面的值
$_SERVER["REQUEST_URI"]   获取 http://localhost 后面的值,包括/
$_SERVER["SCRIPT_NAME"]   获取当前脚本的路径,如:index.php
$_SERVER["PHP_SELF"]      当前正在执行脚本的文件名


注:亦可通过配置 服务器 的,对访问链接进行重写。

         (TP 有支持 Apache 的配置,需要在 程序的  .htaccess 文件中 开启重写引擎 )           

<IfModule mod_rewrite.c>  Options +FollowSymlinks  RewriteEngine On  RewriteCond %{REQUEST_FILENAME} !-d  RewriteCond %{REQUEST_FILENAME} !-f  RewriteRule ^(.*)$ index.php?/$1 [QSA,PT,L]</IfModule>

  Nginx 也支持 重写配置 (暂无了解,需学习)


 TP  也可以通过路由规则,模块化的对 URL进行设定,但是因为这种配置,受限度很大,必须对每个链接都很熟,并且确定链接参数键值,才能确保链接正常访问

    'URL_ROUTER_ON'         =>  false,   // 是否开启URL路由
    'URL_ROUTE_RULES'       =>  array(), // 默认路由规则 针对模块
    'URL_MAP_RULES'         =>  array(), // URL映射定义规则

原创粉丝点击