分享

PHP网址重定向,URL重写教程

 quasiceo 2014-05-25

PHP网址重定向,URL重写教程  

2013-03-18 10:57:14|  分类: php |举报 |字号 订阅

(我现在就想开启和配置:
在conf目录的httpd.conf文件中找到
LoadModule rewrite_module modules/mod_rewrite.so
将这一行前面的#去掉。
2.在要支持url rewirte的目录启用 AllowOverride All,通常是<Directory '/var/www/html>这个主目录下面的AllowOverride,修改这一个就OK
3.在虚拟主机中开启,如下
<VirtualHost phpbook.com:80>
RewriteEngine On
rewriteOptions Inherit
    DocumentRoot /var/www/html/PHPbook/
    ServerName phpbook.com
</VirtualHost>
4.在 /var/www/html/PHPbook/下某个目录书写你的.htaccess
OK完成)

学习目标
1.了解.htaccess常用指令
2.实现网站统一入口

在实现PHP网址重定向的功能之前,必须确保http.conf中已经加载了mod_rewrite模块;
为了能灵活地控制重定向效果,下面开始了解.htaccess几个常用的指令。
rewriteBase指令的功能:指定一个新目录作为重写规则的根目录。有点抽象,下面我们做一个例子了解它的具体功能。

准备工作:

1. 在根目录(域名为)下建立.htaccess文件
rewriteEngine On
rewriteBase /article
rewriteRule ^news_sport1\.html$ news.php?id=1
2.在根目录下建立news.php文件,内容如下
<!--?php
    echo empty($_GET)?'root':'root';
-->
3.在根目录下建立文件夹article,然后在article文件夹里建站news.php,内容为
<!--?php
    echo empty($_GET)?'article':'article';
-->
目的:如果我们在浏览器输入域名http:///news_sport1.html,会输出什么呢?
PHP网址重定向,URL重写教程 - 颓废熊 - 破坏的笔记
 
答案是article
下面我们修改.htaccess的内容,在rewriteBase前面加上’#’符号,将它注释掉,看看这一次输出什么内容?
PHP网址重定向,URL重写教程 - 颓废熊 - 破坏的笔记
 
这一次输出的是root,现在相信你对rewriteBase这一指令的功能已经有了大概的了解了吧。当我们启用rewriteBase命令时,那么符合rewriteRule的网站将被跳转到相应的目录下。
rewriteRule指令的简单学习(知识准备:正则表达式)
rewriteRule的格式为:rewriteRule 网址1 网址2
这样符合网址格式1的地址就会被重定向到网址2
下面对rewriteRule进行修改,将rewriteRule ^news_sport1\.html$ news.php?id=1改为
rewriteRule ^news_sport([\d]+)\.html$ news.php?id=$1
修改news.php的内容为

<!--?php
    echo empty($_GET)?'root':$_GET['id'];
-->
实验效果
PHP网址重定向,URL重写教程 - 颓废熊 - 破坏的笔记
 
可以看到当我们输入news_sport1.html时,$_GET[‘id’]为1,输入news_sport2.html时,$_GET[‘id’]为2
如果我们将rewriteRule 修改为 ^.*$ news.php会有什么效果呢?
PHP网址重定向,URL重写教程 - 颓废熊 - 破坏的笔记
 
可以看到无论我们在浏览器地址栏输入域名加地址,不管事实上这个地址存不存在,都会跳转到news.php这个文件。这样就实现了网站统一入口的功能

多参数的接收


学习目标:从静态网址中提取参数
在前一篇文章中我们已经了解了PHP网址重定向的一些基础知识,这一次我们将学习一些更为复杂的URL重写规则。
打开百度新闻,然后查看几篇新闻的网址,可以看到这些新闻的网址都是静态的网址。

如何实现这样的效果呢?下面我们来进行一个简单的小案例
网址http:///system/2012/10/22/014.html,我们假设每一个正斜杠就是一个请求的参数,比如system为请求目录,2012/10/22分别为请求的年/月/日,014为文章的ID,我们将在目标网页中分别提取这些参数
1.创建.htaccess文件并书写rewriteRule规则
rewriteEngine On
rewriteRule ^([a-zA-Z]+)/([0-9]+)/([0-9]+)/([0-9]+)/([0-9]+)\.html$ /news.php?category=$1&year=$2&month=$3&day=$4&id=$5
2.新建news.php文件

<?php
    if(empty($_GET)){
        echo "empty";
    }else{
        foreach($_GET as $key=>$value){
            echo $key.':'.$value.'<br/>';
        }
    }
?>
3.在浏览器网地址中输入http:///system/2012/10/22/014.html,结果如下
PHP网址重定向,URL重写教程 - 颓废熊 - 破坏的笔记
 
下面我们分析这一解析过程
PHP网址重定向,URL重写教程 - 颓废熊 - 破坏的笔记
 

综合示例

经过前面两篇文章的学习,我们对URL重写已经有了一定的了解,这一篇文章我们将通过一个综合例子来应用重写知识。
效果简述(我想实现以下功能):
1.当我在浏览器中输入catalog.html时,我实际想进入的页面是catalog.php这个分类页面
2.当我点击catalog.html下面某个产品的链接,比如product/apache/1.html时,我实际上是希望跳转到product.php?category=apache?id=1,将apache作为目录参数,1作为商品id号传递给商品信息页
3.我建立了product.php这个商品页面,它会根据传递过来的category和id从数据库中提取出相应的商品信息,并进行显示。

下面将具体实现这些功能
1.建立.htaccess文件
rewriteEngine On
rewriteRule ^catalog\.html$ /catalog.php [L]
rewriteRule ^product/([a-zA-z0-9]+)/([0-9]+)\.html$ /product.php?category=$1&id=$2
2.建立catalog.php文件

<?php
    echo '<ul>';
    echo '<li><a href="product/apache/1.html">this is apache1</a></li>';
    echo '<li><a href="product/php/2.html">here is php2</a></li>';
    echo '</ul>';
?>
3.在浏览器中输出http:///catalog.html,结果如下
PHP网址重定向,URL重写教程 - 颓废熊 - 破坏的笔记
 
4.建立product.php页面(为了简单,这里我只是显示参数)

<?php
    if(empty($_GET)){
        echo "empty";
    }else{
        foreach($_GET as $key=>$value){
            echo $key.':'.$value.'<br/>';
        }
    }
?>
5.点击上面两个链接,可以看到效果如下
PHP网址重定向,URL重写教程 - 颓废熊 - 破坏的笔记
 
实验到这里就已经完成了我们的目标了,但是否还有需要改进的地方呢?

对于商品信息链接,我们是直接采用手写静态链接地址的方式添加上的,但是在实际应用中。这个网址信息通常是从数据库中提取出相应的参数,然后再生成静态网址的。下面我们就看看如何实现这个功能。
结合第3课的代码2分析
2.建立catalog.php文件

<?php
    echo '<ul>';
    echo '<li><a href="product/apache/1.html">this is apache1</a></li>';
    echo '<li><a href="product/php/2.html">here is php2</a></li>';
    echo '</ul>';
?>


实际上我们更希望的代码最好是这样

<?php
    echo '<ul>';
    echo '<li><a href="'.make_url('apache',1).'">this is apache1</a></li>';
    echo '<li><a href="'.make_url('php',2).'">here is php2</a></li>';
    echo '</ul>';
make_url('apache',1);
    function make_url($category,$id){
        return 'product/'.$category.'/'.$id.'.html';
    }
?>
是不是实现了我们的效果了呢…

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多