使用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 相关文章推荐
使用网络地址转换实现多服务器负载均衡
Oct 09 PHP
完美解决dedecms中的[html][/html]和[code][/code]问题
Mar 20 PHP
PHP 错误之引号中使用变量
May 04 PHP
PHP 类型转换函数intval
Jun 20 PHP
PHP类中Static方法效率测试代码
Oct 17 PHP
php防止sql注入示例分析和几种常见攻击正则表达式
Jan 12 PHP
PHP中nowdoc和heredoc使用需要注意的一点
Mar 21 PHP
php 伪静态之IIS篇
Jun 02 PHP
ThinkPHP模板判断输出Defined标签用法详解
Jun 30 PHP
PHP中set error handler函数用法小结
Nov 11 PHP
详解PHP中websocket的使用方法
Sep 15 PHP
PHP实现阿里大鱼短信验证的实例代码
Jul 10 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
PHP中魔术变量__METHOD__与__FUNCTION__的区别
2014/09/29 PHP
在win7中搭建Linux+PHP 开发环境
2014/10/08 PHP
php实现的debug log日志操作类实例
2016/07/12 PHP
javascript的对话框详解与参数
2007/03/08 Javascript
javascript 主动派发事件总结
2011/08/09 Javascript
Kibo 用于处理键盘事件的Javascript工具库
2011/10/28 Javascript
js关闭当前页面(窗口)的几种方式总结
2013/03/05 Javascript
jQuery.position()方法获取不到值的安全替换方法
2015/03/13 Javascript
jQuery 1.9.1源码分析系列(十)事件系统之主动触发事件和模拟冒泡处理
2015/11/24 Javascript
微信小程序 video详解及简单实例
2017/01/16 Javascript
js css3实现图片拖拽效果
2017/03/04 Javascript
js实现年月日表单三级联动
2020/04/17 Javascript
详解vue.js移动端导航navigationbar的封装
2017/07/05 Javascript
React为 Vue 引入容器组件和展示组件的教程详解
2018/05/03 Javascript
使用vue-router完成简单导航功能【推荐】
2018/06/28 Javascript
在Vue项目中引入JQuery-ui插件的讲解
2019/01/27 jQuery
了解重排与重绘
2019/05/29 Javascript
轻松学习JavaScript函数中的 Rest 参数
2019/05/30 Javascript
Vue+abp微信扫码登录的实现代码示例
2020/01/06 Javascript
关于小程序优化的一些建议(小结)
2020/12/10 Javascript
Python基本数据类型详细介绍
2014/03/11 Python
Linux RedHat下安装Python2.7开发环境
2017/05/20 Python
python事件驱动event实现详解
2018/11/21 Python
使用python写一个自动浏览文章的脚本实例
2019/12/05 Python
PyCharm无法识别PyQt5的2种解决方法,ModuleNotFoundError: No module named 'pyqt5'
2020/02/17 Python
css3 边框、背景、文本效果的实现代码
2018/03/21 HTML / CSS
改变生活的男士内衣:SAXX Underwear
2019/08/28 全球购物
实习老师个人总结的自我评价
2013/09/28 职场文书
最新计算机专业自荐信
2013/10/16 职场文书
仓管员岗位职责范文
2013/11/08 职场文书
工商学院毕业生自荐信
2013/11/12 职场文书
电话销售经理岗位职责
2013/12/07 职场文书
八一建军节营销活动方案
2014/08/31 职场文书
2014年个人业务工作总结
2014/11/17 职场文书
大客户经理岗位职责
2015/04/09 职场文书
爸爸的三轮车观后感
2015/06/16 职场文书