做企业站FineCMS是款不错的CMS,今天在做一个客户站的时候发现一个问题比较烦人,客户在分享文章到朋友圈的时候,发现不管分享什么页打开都自动跳转到首页,百思不得其解,百度了下,微信分享url的时候会在结尾加上
http://www.ityang.com/?from=timeline&isappinstalled=0
这种url的后缀。仔细想下,这个站启用了伪静态,测试了下,果然只要url里面有?任何页都跳转到首页,这不科学啊,找问题吧。
以下是三种方案(我代码很垃圾,不知道优缺点就都写出来)
1、抛开官方的方式,直接定义.htaccess
RewriteEngine On
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^([a-zA-Z0-9]+)/$ index.php?c=content&a=list&catdir=$1 [L]
RewriteRule ^([a-zA-Z0-9]+)-([0-9]+)/$ index.php?c=content&a=list&catdir=$1&page=$2 [L]
RewriteRule ^([a-zA-Z0-9]+)/([0-9]+).html$ index.php?c=content&a=show&catdir=$1&id=$2 [L]
RewriteRule ^([a-zA-Z0-9]+)/([0-9]+)-([0-9]+).html$ index.php?c=content&a=show&catdir=$1&id=$2&page=$3 [L]
这个我测试了基本都没问题,就算有问题,暂时还没找到,哈哈,不过需要删除官方.htaccess原来的
RewriteRule !\.(js|ico|gif|jpg|png|css|swf)$ index.php [L]
这句,如果不删除,后台url路径找不到。
2、群里一位朋友的方法
(1)找到\dayrui\core\Router.php,大概在113行插入以下代码
//----修改
$access = true;
$special = array("s=","captcha","attachment",'=api');
foreach($special as $v){
if(stristr($_SERVER['REQUEST_URI'],$v)){
$access = false;
break;
}
}
if(stristr($_SERVER['REQUEST_URI'],"?") && $access){
unset($_SERVER['QUERY_STRING']);
}
//----修改
如图
(2)找到\config\router.ini.php,修改伪静态规则
'^([a-zA-Z0-9]+)\.html.*' => 'c=content&a=list&catdir=${1}',
'^([a-zA-Z0-9]+)\-page([0-9]+)\.html' => 'c=content&a=list&catdir=${1}&page=${2}',
'^([a-zA-Z0-9]+)\-([0-9]+)\.html' => 'c=content&a=show&id=${2}',
'^([a-zA-Z0-9]+)\-([0-9]+)\-([0-9]+)\.html' => 'c=content&a=show&id=${2}&page=${3}',
这种伪静态规则没问题,url带上带问号的参数也能访问。但是如果用我的伪静态方式列表页就不可以,代码如下
'^([a-zA-Z0-9]+)/$' => 'c=content&a=list&catdir=${1}',
'^([a-zA-Z0-9]+)/([0-9]+)/$' => 'c=content&a=list&catdir=${1}&page=${2}',
'^([a-zA-Z0-9]+)/([0-9]+).html' => 'c=content&a=show&id=${2}',
'^([a-zA-Z0-9]+)/([0-9]+)\-([0-9]+).html' => 'c=content&a=show&id=${2}&page=${3}',
因为用目录的形式,列表页如果用*通配符的话和内容页规则冲突,在列表页点任何url都是自己。NND,以后想办法解决。
3、论坛一个兄弟的代码
(1)在router.ini.php文件,伪静态链接后面加入(.*) 如图所示,(伪静态规则,请根据设置的规则自行修改)
(2)修改dayrui\core\Router.php 文件 在约第112行
//$path_url_string = isset($_SERVER['QUERY_STRING']) && $_SERVER['QUERY_STRING'] ? $_SERVER['QUERY_STRING'] : (strlen($_SERVER['REQUEST_URI']) == 1 || $_SERVER['REQUEST_URI'] == '/' . ENTRY_SCRIPT_NAME ? '' : $_SERVER['REQUEST_URI']);
$path_url_string = $_SERVER['REQUEST_URI'];
if(strpos($path_url_string,'index.php')){
$path_url_string = $_SERVER['QUERY_STRING'];
}elseif(strpos($path_url_string,'?')) {
$path_url_string = strstr($path_url_string,'?',TRUE);
}
$new_url_string = '';
$flag = !isset($_SERVER['QUERY_STRING']) || empty($_SERVER['QUERY_STRING']);
$flag = $flag || strpos($_SERVER['REQUEST_URL'],'index.php')==false;
if ($flag) {
$router_config_file = CONFIG_DIR . 'router.ini.php';
if (is_file($router_config_file)) {
这个规则带?就访问自己对了,但是后台的路径就有问题。
三方法都列出来,有大神改进的话最好,我暂时用自己的第一种。