php实现伪静态的方法比较多,网上的相关资料非常多。这里主要介绍基于apache的URL重写模块的伪静态和基于错误404的伪静态实现方法。

   以做米表系统时伪静态需求为例,详述实现过程。

PHP+APACHE实现伪静态

  1. 首先打开httpd.conf
    将‘#LoadModule rewrite_module modules/mod_rewrite.so’前面的‘#’去掉,这样你的APACHE就支持URL重写了。为了防止出现500错误,还应该经行下面的设置。
  2. 还是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了。
  3. 为你的网站设置url重写规则
    用记事本新建一个空白的文档,点击‘文件’‘另存为’,将文件另存为‘.htaccess’。注意,这个文件没有文件名,我们的重写规则就要写到这个文件中。编辑这个文件我们也是用记事本。下面是一个简单的例子
    1. # zijie.org 
    2. <IfModule mod_rewrite.c> 
    3. RewriteEngine On 
    4. RewriteBase /yumi/ 
    5. RewriteRule ^([-[:alnum:]\.]{1,})+\/$ /yumi/domain.php?domain=$1&css=weijingtai 
    6. </IfModule> 
    7. # 这里只是一些注释文字
    8.  
    上面代码中的#是注释标志;‘ <IfModule mod_rewrite.c>’含义是‘如果APACHE支持了重写模块’;‘RewriteEngine On'告诉系统打开重写引擎(可以不写这一句);‘RewriteBase /yumi/’设置你想实现伪静态的目录,如果选择整个网站直接输入‘/’;‘RewriteRule’就是重写规则了,其实就是一个正则表达式。
  4. 正则表达式的编写
    上面代码中的^和$是表达式的开始和结尾标识符而()内的部分为子表达式[-[:alnum:]\.]{1,},它能匹配字母数字下划线和.。也就是能匹配一个域名,如果匹配成功那么apache会把形如http://www.zijie.org/yumi/zijie.org/重写成http://www.zijie.org/yumi/domain.php?domain=zijie.org。想了解更多正则表达式的内容推荐参考php.net的相关内容。
  5. 最后一步,php接收参数
    可以用$_REQUEST[]或者$_GET[]来接收参数。
    1. echo '你的参数是:'.$_GET['domain']; 

PHP+IIS实现伪静态

IIS实现伪静态需要专门下载相关的组件,这类文章网上比较多,这里不再重复。

PHP利用404错误实现伪静态

  1. 若果你的服务器不支持apache的重写模块,我们还有一个很灵巧的方法来实现伪静态,那就是利用自定义404错误页面。当然,你的服务器要支持自定义错误页面(现在已经虚拟主机或者vps的标配)。
  2. 如何开启本地服务器的404错误页面
    在httpd.conf中有#ErrorDocument 404 你需要去掉#开启404错误页面。可以直接自定义错误页面比如ErrorDocument 404 /404/index.php,如果访问者访问了一个不存在的页面,那么apache会调用/404/目录下的index.php。
  3. 如何设置虚拟主机的404页面
    登录后台后,一般在主机管理里能找到“自定义错误页面”之类的链接,按照提示很容易设置成功。实在不行就联系客服。
  4. 实例
    在这里我想利用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可以如下编写
    1. $url=ltrim($_SERVER['REQUEST_URI'].$_SERVER['QUERY_STRING'],'/'); 
    2. $url=explode('/',$url,2); 
    3. if($url[0]=='artical'){ 
    4.   include ("http://a.com/artical.php?id=$url[1]"); 
    5. else 
    6. die('你访问的页面不存在'); 
  5. 需要注意的是include的文件地址必须是带http的,这样我们直接能够传参。如果用其他方法传参的话可以直接include('artical.php')。
     

伪静态的更多问题欢迎加入QQ群142357324讨论。本文为作者原创,转载请注明来自zijie.org。