背景:对一个使用 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']
$_SERVER['SCRIPT_NAME']
$_SERVER['PHP_SELF']
2,http://localhost/aaa/?p=222 (附带查询)
结果:
$_SERVER['QUERY_STRING'] = "p=222";
$_SERVER['REQUEST_URI']
$_SERVER['SCRIPT_NAME']
$_SERVER['PHP_SELF']
3,http://localhost/aaa/index.php?p=222&q=333
结果:
$_SERVER['QUERY_STRING'] = "p=222&q=333";
$_SERVER['REQUEST_URI']
$_SERVER['SCRIPT_NAME']
$_SERVER['PHP_SELF']
由实例可知:
$_SERVER["QUERY_STRING"]
$_SERVER["REQUEST_URI"]
$_SERVER["SCRIPT_NAME"]
$_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映射定义规则