php实现伪静态的方法
发表于2016-04-16 20:33:58阅读250196次
php实现伪静态的方法比较多,网上的相关资料非常多。这里主要介绍基于apache的URL重写模块的伪静态和基于错误404的伪静态实现方法。
以做米表系统时伪静态需求为例,详述实现过程。
PHP+APACHE实现伪静态
- 首先打开httpd.conf
将‘#LoadModule rewrite_module modules/mod_rewrite.so’前面的‘#’去掉,这样你的APACHE就支持URL重写了。为了防止出现500错误,还应该经行下面的设置。 - 还是httpd.conf
按Ctrl+F查找到‘AllowOverride None’,一般情况下你会找到2处。选择你的网站所在的那个目录,比如我选择的应该是‘<Directory "D:/site/">’,而不是apache系统所在的目录:‘<Directory "D:/Program Files/Apache Software Foundation/Apache2.2/cgi-bin">’。确定好位置之后把‘None’修改为‘All’。这样你就不大可能一直遇见错误500了。 - 为你的网站设置url重写规则
用记事本新建一个空白的文档,点击‘文件’‘另存为’,将文件另存为‘.htaccess’。注意,这个文件没有文件名,我们的重写规则就要写到这个文件中。编辑这个文件我们也是用记事本。下面是一个简单的例子
上面代码中的#是注释标志;‘ <IfModule mod_rewrite.c>’含义是‘如果APACHE支持了重写模块’;‘RewriteEngine On'告诉系统打开重写引擎(可以不写这一句);‘RewriteBase /yumi/’设置你想实现伪静态的目录,如果选择整个网站直接输入‘/’;‘RewriteRule’就是重写规则了,其实就是一个正则表达式。- # zijie.org
- <IfModule mod_rewrite.c>
- RewriteEngine On
- RewriteBase /yumi/
- RewriteRule ^([-[:alnum:]\.]{1,})+\/$ /yumi/domain.php?domain=$1&css=weijingtai
- </IfModule>
- # 这里只是一些注释文字
- 正则表达式的编写
上面代码中的^和$是表达式的开始和结尾标识符而()内的部分为子表达式[-[:alnum:]\.]{1,},它能匹配字母数字下划线和.。也就是能匹配一个域名,如果匹配成功那么apache会把形如http://www.zijie.org/yumi/zijie.org/重写成http://www.zijie.org/yumi/domain.php?domain=zijie.org。想了解更多正则表达式的内容推荐参考php.net的相关内容。 - 最后一步,php接收参数
可以用$_REQUEST[]或者$_GET[]来接收参数。 - echo '你的参数是:'.$_GET['domain'];
PHP+IIS实现伪静态
IIS实现伪静态需要专门下载相关的组件,这类文章网上比较多,这里不再重复。
PHP利用404错误实现伪静态
- 若果你的服务器不支持apache的重写模块,我们还有一个很灵巧的方法来实现伪静态,那就是利用自定义404错误页面。当然,你的服务器要支持自定义错误页面(现在已经虚拟主机或者vps的标配)。
- 如何开启本地服务器的404错误页面
在httpd.conf中有#ErrorDocument 404 你需要去掉#开启404错误页面。可以直接自定义错误页面比如ErrorDocument 404 /404/index.php,如果访问者访问了一个不存在的页面,那么apache会调用/404/目录下的index.php。 - 如何设置虚拟主机的404页面
登录后台后,一般在主机管理里能找到“自定义错误页面”之类的链接,按照提示很容易设置成功。实在不行就联系客服。 - 实例
在这里我想利用404页面实现如下的伪静态效果
用户输入:a.com/artical/100.html 真实页面是:a.com/artical?id=100
当用户输入a.com/artical/100.html后,该页面不存在,Apache会把页面交给/404/index.php处理。注意,这里不是重定向,用户(蜘蛛)实际上并不知道Apache已经把他的请求交给了/404/index.php 。在他看来,a.com/artical/100.html是一个正常的页面。而/404/index.php可以根据PHP的$_SERVER['REQUEST_URI']变量知道网页的来源是a.com/artical/100.html。这里$_SERVER['REQUEST_URI']的值是artical/100.html。所以我们的404/index.php可以如下编写 - $url=ltrim($_SERVER['REQUEST_URI'].$_SERVER['QUERY_STRING'],'/');
- $url=explode('/',$url,2);
- if($url[0]=='artical'){
- include ("http://a.com/artical.php?id=$url[1]");
- }
- else
- die('你访问的页面不存在');
- 需要注意的是include的文件地址必须是带http的,这样我们直接能够传参。如果用其他方法传参的话可以直接include('artical.php')。
伪静态的更多问题欢迎加入QQ群142357324讨论。本文为作者原创,转载请注明来自zijie.org。