伪静态

---恢复内容开始---

页面静态化是真静态,因为生产静态的html文件,所谓的伪静态是假的静态,伪静态的效果是这个样子:http://localhost/0423/question/add.html

访问的时候会进入question控制器的add方法中,但是给用户的感觉是静态页面,实际上还是会动态解析,所以称之为伪静态

index.php?c=question&a=addAction

 伪静态的优点

(1) url地址简洁,方便用户记忆

(2) SEO(搜索引擎优化)(注:搜索引擎包括:百度、360搜索、搜狗、谷歌),比较友好

index.php?m=home&c=question&a=indexAction,会根据参数的不同进入到不同的页面(日历:y=2018&m=12&d=23),担心页面没有穷尽,当然现在搜索引擎技术不断进步(对动态网站内容专区也会越来越好)

使用伪静态的地址:question/index.html,看到网页的时候认为你是静态的网页多多抓取

(3) 搜索引擎爬虫采集的原理SEO实战密码):

(1) 采集网站的内容,筛选出现次数比较多的单词(关键字),将网站的内容保存到自己的数据库

(2) 排序(访问量、内容多少、原创数据、外部链接、爬虫抓取时间等等)综合的排名

(3) 如果同学们做网站的时候,学会掌握关键词的分布,经验:夹缝中求生存,关键词的排布:昌平区190专用鞋、运动员专用鞋(长尾理论)

 

 伪静态实现:

步骤

(1) 如果我现在直接访问:index.php/question/add.html,会提示:not found

因为我们在index.php入口文件中,分别获得模块、控制器、方法是谁,但是通过上面的url地址,无法获得$_GET[‘m’]$_GET[‘c’]$_GET[‘a’]这些信息了思路:认准我们的目的:最终还是要访问到:哪个模块、哪个控制器、哪个方法,根据现在的url地址解析出,其对应的mca

 

(2) 借助PHP超全局数组变量:$_SERVER[‘PATH_INFO’]获得路径的信息,如果index.php后面有路径信息则返回,如果index.php后面没有路径信息,则提示未定义

 

 

 

 

 

 

 

 

 

 

 

(1) 根据index.php后面的路径的信息,解析出对应的$_GET[‘m’]$_GET[‘c’]$_GET[‘a’],说明由于url地址是我们开发人员指定的有一定的规律所以我们解析的时候也会按照我们定义的规则进行解析

我指定的规则如下:

先把.html.htm 这样的字符替换掉

字符串分割explode()炸开,获得数组

根据炸开之后的数组的元素个数进行分类

情况1admin

解析到后台进入到默认的控制器默认方法中

情况2admin/question

解析到后台模块的question控制器默认的动作

情况3admin/question/add

解析到后台、question控制器的add方法

情况4admin/question/delete/id/2

解析到后台、question控制器、delete方法额外参数是id=2

 1  //初始化路径信息
 2     public function initPathinfo()
 3     {        
 4         if(isset($_SERVER['PATH_INFO'])){
 5             //使用我们自己定义的规则
 6             //echo '<pre>';
 7             //var_dump($_SERVER['PATH_INFO']);
 8             //die;
 9             $path = $_SERVER['PATH_INFO'];
10             //1. 将.html   .htm等障眼法给删除
11             $last_fix = strrchr($path, '.');
12             $path = str_replace($last_fix, '', $path);  //   /admin/question/add
13             //2. 根据 / 分割成数组
14             $path = substr($path, 1);                   //   admin/question
15             $arr = explode('/', $path);             
16             $length = count($arr);
17             if($length==1){
18                 //说明只有模块,控制器、方法采用默认的,不用在这里指定
19                 $_GET['m'] = $arr[0];
20             }elseif($length==2){
21                 //指定模块、控制器分别是谁,方法不用指定,采用默认的
22                 $_GET['m'] = $arr[0];
23                 $_GET['c']= $arr[1];
24             }elseif ($length==3){
25                 //指定mca分别是谁
26                 $_GET['m'] = $arr[0];
27                 $_GET['c']= $arr[1];
28                 $_GET['a']= $arr[2];
29             }else{
30                 //大于3个,前3个还是mca,后面的是额外的参数了
31                 $_GET['m'] = $arr[0];
32                 $_GET['c']= $arr[1];
33                 $_GET['a']= $arr[2];
34                 //第3个之后的参数,每两个一对
35                 for ($i=3;$i<$length;$i+=2){
36                     //$_GET['k']= 'PHP';
37                     $_GET[$arr[$i]] = $arr[$i+1];
38                 }           
39             }
40         }
41         //如果没有在index.php后面设置路径信息,则还是用之前的解析规则        
42     }

 隐藏入口文件

有的网站不想让用户看到网站采用什么语言开发、其次想让url地址更加简洁

但是如果现在我们直接访问,不携带index.php

原因就是我们的自动加载路径常量初始化MCA等,都是在index.php里面进行处理,

通过修改apache的配置文件实现当访问的url地址指向的不是一个文件不是一个目录的时候将该url地址信息作为index.php后面的PATH_INFO进行处理

说明:由于将来开发的时候,一般员工没有权限接触apache的配置文件,所以apache提供了一个分布式配置文件(.htaccess

分布式配置文件,只针对当前项目有效,对其他项目没有影响,而且不用重启apache服务器

步骤

步骤1:首先要在apache的配置文件中开启重写模式(也就是允许使用分布式配置系统)

步骤3:如何实现,访问:localhost/0423时,不用展示索引列表,而是直接显示index.php的首页的内容

通过apache的配置实现:

 

分布式配置文件(.htaccess

代码如下:

<IfModule rewrite_module>
    #开启重写引擎
    RewriteEngine on
    #重写的条件(访问的url地址指向的不是文件、不是目录的时候,采用重写机制)
    RewriteCond %{REQUEST_FILENAME} !-d
    RewriteCond %{REQUEST_FILENAME} !-f
    
    #重写规则
    RewriteRule (.*) index.php?/$1    
</IfModule>

#当访问的是一个目录时,会将如下文件作为默认的欢迎页面,会先显示index.html,如果没有则显示index.php
<IfModule dir_module>
    DirectoryIndex index.html index.php
</IfModule>

 

 

---恢复内容结束---

posted @ 2018-09-17 16:07  L1230205  阅读(199)  评论(0编辑  收藏  举报