使用Apache的rewrite技术


Posted in PHP onJune 22, 2006

使用Apache的rewrite技术

做PHP项目中需要用到URL重定向技术,基本上的需求就是把比如 /user/heiyeluren 重定向到 /user.php?uid=heiyeluren 之类的URL上,当然,你也可以把 /article/200707291011.html重定向到 /article.php?id=200507291011 之类的,模拟好像是静态页面,能够隐藏URL真实地址,有助于雨鞋基本的安全防范等等。那么好像rewrite是个很好的解决办法。

要在Apache里运行rewrite的话,必须先安装mod_rewrite的组件,就是一个mod_rewrite.c文件,然后必须在./configure的时候要放上mod_rewrite就能安装。
一般配置rewrite的话,可以在httpd.conf里面配置,也能在网页当前目录的.htaccess文件里进行定义来决定重定向去那个文件,那样的话,就非常具有灵活性了,同样也能够适合虚拟主机用户来做。

我们看一个.htaccess文件的例子:

RewriteEngine On
RewriteBase /
RewriteCond %{REQUEST_FILENAME} -f [OR]
RewriteCond %{REQUEST_FILENAME} -d
RewriteRule ^.*$ - [S=42]

#RewriteRule ^share/$ /share.php [QSA,L]
RewriteRule ^tag/([^/]+)/?$ /user_tags.php?tag=$1 [QSA,L]
RewriteRule ^city/([^/]+)/?$ /user_city.php?tag=$1 [QSA,L]
#RewriteRule ^([^/]+)/day/([^/]+)/?$ /user_share.php?id=$1&s=1&selTime=$2 [QSA,L]
#RewriteRule ^([^/]+)/day/([^/]+)/?$ /user_share.php?id=$1&s=1&selTime=$2 [QSA,L]

RewriteRule ^([^/]+)/day/([^/]+)/?$ /user_share.php?id=$1&s=1&selTime=$2 [QSA,L]
RewriteRule ^([^/]+)/week/([^/]+)/?$ /user_share.php?id=$1&s=2&selTime=$2 [QSA,L]
RewRiteRule ^([^/]+)/month/([^/]+)/?$ /user_share.php?id=$1&s=3&selTime=$2 [QSA,L]

RewriteRule ^([^/]+)/day/?$ /user_share.php?id=$1&s=1    [QSA,L]
RewriteRule ^([^/]+)/week/?$ /user_share.php?id=$1&s=2   [QSA,L]
RewriteRule ^([^/]+)/month/?$ /user_share.php?id=$1&s=3  [QSA,L]

RewriteRule ^([^/]+)/?$ /user_share.php?id=$1    [QSA,L]

比较长吧,我们就简单关注一下关键的内容。之间就是定义的内容,RewriteEngine就是确定是否运行URL重写功能,RewriteBase就是基本的路径是什么,最关键的就是下面的RewriteRule,就是我们需要重写的规则了,这里应用了兼容Perl规则的正则表达式:

 

Text:
  .           匹配任意单个字符
  [chars]     匹配当前字符
  [^chars]    不匹配当前字符
  text1|text2 包含text1或者text2任何一个
Quantifiers:
  ?           零个或者一个?号前的字符
  *           零个或者任意个任意长度的任意字符
  +           一个或者任意个任意长度的字符
Grouping:
  (text)      Grouping of text
              (either to set the borders of an alternative or
              for making backreferences where the Nth group can
              be used on the RHS of a RewriteRule with $N)
Anchors:
  ^           匹配内容开始标记
  $           匹配内容结束标记
Escaping:
  \char       使用\来进行特殊字符的转义,包括".[]()"等字符的转义

 

基本规则如上,比如下面的正则表达式:^/([^/]+)/~([^/]+)/(.*)$ 就是能够匹配象 /Language/~ Realname/.../File 这样的路径。

那么从这个角度去看上面的内容就比较容易理解了。我们简单看一下RewriteRule指令的规则:
RewriteRule   访问的路径    需要指向的真实路径
这样就很清楚了,比如说我要把/user/heiyeluren重定向到/user.php?uid=heiyeluren那么我的规则就必须这样:

RewriteRule ^user/([^/]+)$  ^/user.php?uid=$2 [QSA,L]

举一反三,就很容易理解规则如何去写,也就能够理解上面规则脚本的内容了。      

没有清楚的,请参考附上的链接,更深入的了解具体内容。写的不好请见谅。

附:

  • Apache Rewrite 技术 http://www.yujs.com/recommendation/004.htm
  • Apache模块 mod_rewrite http://linux.dalouis.com/doc/apache2.0/mod/mod_rewrite.html
  • URL重写指南 http://linux.dalouis.com/doc/apache2.0/misc/rewriteguide.html
  • Apache HTTP服务器 2.0版本文档 http://linux.dalouis.com/doc/apache2.0/
PHP 相关文章推荐
php 数组二分法查找函数代码
Feb 16 PHP
php下用cookie统计用户访问网页次数的代码
May 09 PHP
php导入导出excel实例
Oct 25 PHP
保存到桌面、设为桌面且带图标的PHP代码
Nov 19 PHP
php生成excel文件的简单方法
Feb 08 PHP
PHP网页游戏学习之Xnova(ogame)源码解读(三)
Jun 23 PHP
PHP会话控制:Session与Cookie详解
Sep 27 PHP
php自定义hash函数实例
May 05 PHP
php猜单词游戏
Sep 29 PHP
利用PHP自动生成印有用户信息的名片
Aug 01 PHP
PHP 配置后台登录以及模板引入
Jan 24 PHP
Yii框架批量插入数据扩展类的简单实现方法
May 23 PHP
php正则
Jul 07 #PHP
从零开始 教你如何搭建Discuz!4.1论坛
Jul 07 #PHP
php分页函数
Jul 08 #PHP
PHP初学者头疼问题总结
Jul 08 #PHP
WinXP + Apache +PHP5 + MySQL + phpMyAdmin安装全功略
Jul 09 #PHP
最令PHP初学者头痛的十四个问题
Jul 12 #PHP
PHP截取中文字符串的问题
Jul 12 #PHP
You might like
yiic命令时提示“php.exe”不是内部或外部命令的解决方法
2014/12/18 PHP
Laravel 5框架学习之路由、控制器和视图简介
2015/04/07 PHP
PHP空值检测函数与方法汇总
2017/11/19 PHP
php原生数据库分页的代码实例
2019/02/18 PHP
如何用javascript去掉字符串里的所有空格
2007/02/08 Javascript
读jQuery之四(优雅的迭代)
2011/06/20 Javascript
JS实现悬浮移动窗口(悬浮广告)的特效
2013/03/12 Javascript
基于JQuery 滑动与动画的说明介绍
2013/04/18 Javascript
PHP abstract与interface之间的区别
2013/11/11 Javascript
jquery实现的树形目录实例
2015/06/26 Javascript
jquery用ajax方式从后台获取json数据后如何将内容填充到下拉列表
2015/08/26 Javascript
Nodejs Stream 数据流使用手册
2016/04/17 NodeJs
BootStrap创建响应式导航条实例代码
2016/05/31 Javascript
react-native 封装选择弹出框示例(试用ios&android)
2017/07/11 Javascript
jQuery+Ajax请求本地数据加载商品列表页并跳转详情页的实现方法
2017/07/12 jQuery
ionic3 懒加载
2017/08/16 Javascript
javaScript动态添加Li元素的实例
2018/02/24 Javascript
使用Vuex解决Vue中的身份验证问题
2018/09/28 Javascript
微信小程序--获取用户地理位置名称(无须用户授权)的方法
2019/04/29 Javascript
vue-cli3项目展示本地Markdown文件的方法
2019/06/07 Javascript
小程序实现锚点滑动效果
2019/09/23 Javascript
Python代码的打包与发布详解
2014/07/30 Python
构建Python包的五个简单准则简介
2015/06/15 Python
python实现剪切功能
2019/01/23 Python
Python面向对象之继承原理与用法案例分析
2019/12/31 Python
tensorflow实现测试时读取任意指定的check point的网络参数
2020/01/21 Python
详解python中GPU版本的opencv常用方法介绍
2020/07/24 Python
伦敦最著名的老字号百货公司:Selfridges(塞尔福里奇百货)
2016/07/25 全球购物
美国环保妈妈、儿童和婴儿用品购物网站:The Tot
2019/11/24 全球购物
澳大利亚床上用品、浴巾和家居用品购物网站:Bambury
2020/04/16 全球购物
瑞士男士时尚网上商店:Babista
2020/05/14 全球购物
幼儿园园长自我鉴定
2013/10/22 职场文书
幼儿教师考核制度
2014/01/25 职场文书
2015年教师节感恩寄语
2015/03/23 职场文书
2015年前台个人工作总结
2015/04/03 职场文书
2016年小学生迎国庆广播稿
2015/12/18 职场文书