(我现在就想开启和配置:
在conf目录的httpd.conf文件中找到LoadModule rewrite_module modules/mod_rewrite.so将这一行前面的#去掉。2.在要支持url rewirte的目录启用 AllowOverride All,通常是这个主目录下面的AllowOverride,修改这一个就OK
3.在虚拟主机中开启,如下
RewriteEngine On
rewriteOptions Inherit
DocumentRoot /var/www/html/PHPbook/
ServerName phpbook.com
4.在/var/www/html/PHPbook/下某个目录书写你的.htaccess
OK完成)
学习目标
1.了解.htaccess常用指令
2.实现网站统一入口
在实现PHP网址重定向的功能之前,必须确保http.conf中已经加载了mod_rewrite模块;
为了能灵活地控制重定向效果,下面开始了解.htaccess几个常用的指令。
rewriteBase指令的功能:指定一个新目录作为重写规则的根目录。有点抽象,下面我们做一个例子了解它的具体功能。
准备工作:
1. 在根目录(域名为tp.com)下建立.htaccess文件
rewriteEngine On
rewriteBase /article
rewriteRule ^news_sport1\.html$ news.php?id=1
2.在根目录下建立news.php文件,内容如下
3.在根目录下建立文件夹article,然后在article文件夹里建站news.php,内容为
目的:如果我们在浏览器输入域名http://tp.com/news_sport1.html,会输出什么呢?
答案是article
下面我们修改.htaccess的内容,在rewriteBase前面加上’#’符号,将它注释掉,看看这一次输出什么内容?
这一次输出的是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的内容为
实验效果
可以看到当我们输入news_sport1.html时,$_GET[‘id’]为1,输入news_sport2.html时,$_GET[‘id’]为2
如果我们将rewriteRule 修改为 ^.*$ news.php会有什么效果呢?
可以看到无论我们在浏览器地址栏输入域名加地址,不管事实上这个地址存不存在,都会跳转到news.php这个文件。这样就实现了网站统一入口的功能
多参数的接收
学习目标:从静态网址中提取参数
在前一篇文章中我们已经了解了PHP网址重定向的一些基础知识,这一次我们将学习一些更为复杂的URL重写规则。
打开百度新闻,然后查看几篇新闻的网址,可以看到这些新闻的网址都是静态的网址。
如何实现这样的效果呢?下面我们来进行一个简单的小案例
网址http://tp.com/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文件
if(empty($_GET)){
echo "empty";
}else{
foreach($_GET as $key=>$value){
echo $key.':'.$value.'
';
}
}
?>
3.在浏览器网地址中输入http://tp.com/system/2012/10/22/014.html,结果如下
下面我们分析这一解析过程
综合示例
经过前面两篇文章的学习,我们对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文件
echo '
- ';
echo '
this is apache1';echo '
here is php2';echo '
';?>
3.在浏览器中输出http://tp.com/catalog.html,结果如下
4.建立product.php页面(为了简单,这里我只是显示参数)
if(empty($_GET)){
echo "empty";
}else{
foreach($_GET as $key=>$value){
echo $key.':'.$value.'
';
}
}
?>
5.点击上面两个链接,可以看到效果如下
实验到这里就已经完成了我们的目标了,但是否还有需要改进的地方呢?
对于商品信息链接,我们是直接采用手写静态链接地址的方式添加上的,但是在实际应用中。这个网址信息通常是从数据库中提取出相应的参数,然后再生成静态网址的。下面我们就看看如何实现这个功能。
结合第3课的代码2分析
2.建立catalog.php文件
echo '
- ';
echo '
this is apache1';echo '
here is php2';echo '
';?>
实际上我们更希望的代码最好是这样
echo '
- ';
echo '
this is apache1';echo '
here is php2';echo '
';make_url('apache',1);
function make_url($category,$id){
return 'product/'.$category.'/'.$id.'.html';
}
?>
是不是实现了我们的效果了呢…