伪静态
---恢复内容开始---
页面静态化是真静态,因为生产静态的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地址解析出,其对应的m、c、a
(2) 借助PHP超全局数组变量:$_SERVER[‘PATH_INFO’]获得路径的信息,如果index.php后面有路径信息则返回,如果index.php后面没有路径信息,则提示未定义
(1) 根据index.php后面的路径的信息,解析出对应的$_GET[‘m’]、$_GET[‘c’]、$_GET[‘a’],说明:由于url地址是我们开发人员指定的,有一定的规律,所以我们解析的时候,也会按照我们定义的规则进行解析
我指定的规则如下:
u 先把.html、.htm 这样的字符替换掉
u 字符串分割:explode()炸开,获得数组
u 根据炸开之后的数组的元素个数进行分类:
情况1:admin
解析到后台,进入到默认的控制器、默认方法中
情况2:admin/question
解析到后台模块的question控制器,默认的动作
情况3:admin/question/add
解析到后台、question控制器的add方法
情况4:admin/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服务器
l 步骤:
步骤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>
---恢复内容结束---