php中使用伪静态

上次简单的说了下php中正则表达式的使用,这一次正则表达式可以派上用场了,学习伪静态需要能够很好的使用正则表达式,那么伪静态和真静态的区别是什么呢,我觉得应该是伪静态可以节约磁盘空间、利于SEO、访问速度上没有真静态那么快。伪静态也是对apache的rewrite机制的使用,下来就来分享下吧

1.使用伪静态首先要确认打开rewrite模块

首先打开httpd.conf,找到LoadModule rewrite_module modules/mod_rewrite.so去掉前面的#即可之后重启apache,使用phpinfo确认重写模块成功启用

php中使用伪静态

看到有红色这个就说明rewrite已经启用成功了

2.使用伪静态要先在Directory里加一句AllowOverride All

这一句可以加在apache的htdocs的Directory节点里或者虚拟主机的Directory节点里

<Directory "D:/Program Files/Apache/htdocs">
Options Indexes FollowSymLinks
AllowOverride All
Order allow,deny
Allow from all
</Directory>

之后的伪静态重写规则可以在Directory节点里写,也可以写在一个单独的.htaccess文件里,我强烈推荐使用后面这种方式

3.apache指定首页面、错误页

首先新建一个.htaccess文件,一般是先新建一个xx.txt文件另存为即可,这个文件我就放到项目的根目录,这个文件的内容如下

DirectoryIndex index.php
ErrorDocument 404 /static2/404.php

下面先来测试404,我们先访问一个不存在的php看看404生效没有,这个是我的错误页面

<?php
echo "错误页面";
?>

下面是运行截图

php中使用伪静态

首页的html如下

<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>系统首页</title>
</head>
<body>
欢迎
</body>
</html>

我们直接把地址定位到根目录,回车后就能看到我们的这个首页了

php中使用伪静态

还有这么一种情况需要考虑那就是访问的时候apache列出目录结构的问题,其实很简单就在.htaccess加一句Options None,需要注意的是Directory里就不能配置Options了,否则会出现403错误

4.伪静态的使用

http://localhost/static2/view-sports-id5.html类似这种url我们应该见过很多了,这种就是一种伪静态的url了,我们看上去访问的是一个静态的html但其实不是,类似这种url像sports和id后面的5可能就是程序中要使用的参数,我们访问的其实是一个动态页面。这样的话比较利于SEO,下面上一段配置给大家看看

<IfModule rewrite_module>
RewriteEngine on
RewriteRule view-([a-zA-Z_]+)-id(\d+)\.html news.php?type=$1&id=$2
</IfModule>

RewriteEngine on的意思是启用apache的rewrite引擎

RewriteRule表示重写规则,第一个空格后面的是正则规范后面的news.php?type=$1&id=$2才是真正访问的php页面,$1表示前面正则规范的第一个子表达式的值,$2以此类推,这样我们就可以在news.php取得参数的值

php中使用伪静态

同样的如果是控制器也可以在相应文件夹里写一个.htaccess,之后加上我们的重写规则

5.使用.htaccess来控制访问权限

日常的开发中我们可能在项目里面写了DAO,控制器,工具类这一大堆的php,而这些文件我们是不希望别人通过浏览器访问到,这种情况使用session来限制似乎也不奏效,这种情况使用重写规则就很简单了

RewriteRule [a-zA-Z0-9_]+\.class\.php 403.html

这样写一句程序之外访问就跳转到另外一个页面,实现了访问的控制

php中使用伪静态

6.RewriteCond的使用

有时我们需要判断在某种情况下才使用重写,这种情况就要使用RewriteCond了,例如我们可以判断请求的是不是一个文件(或不存在的文件),如果满足条件才执行重写规则

#如果请求的不是一个文件
RewriteCond %{REQUEST_FILENAME} !-f
#并且不是一个目录
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ccc.html index.php

这段配置的意思就是如果请求的ccc.html如果不存在则跳转到index,php

再来看最后一段配置

<ifModule rewrite_module>
RewriteEngine On
#你怎么知道,这个请求就是www.hsp.com发来的. referer
#如果你请求的是一个jpg图片, 就禁止
RewriteCond %{HTTP_REFERER} !www.hsp.com
RewriteRule .*\.jpg -[F]
</ifModule>

[F]表示拒绝访问,其他的看看注释应该能看懂

最后总结一下,日常开发中并不是所有的页面都要静态化,例如后台系统、基金股票等要求实时性很高的页面或网站、实时话费或流量查询页面、学历查询页面不适合静态化,对应内容相对稳定的例如宣传性质的网站首页可以考虑使用真静态,如果不想使用真静态但是又希望利于SEO伪静态应该是一个不错的选择。

上一篇:解决FragmentTabHost切换标题栏变更问题


下一篇:翻译一篇文章:It's Difficult to Grow a Test Developer(成为测试开发工程师的艰辛)