使用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 for 循环语句使用方法详细说明
May 09 PHP
PHP调用Webservice实例代码
Jul 29 PHP
php实现猴子选大王问题算法实例
Apr 20 PHP
php抓取网站图片并保存的实现方法
Oct 29 PHP
PHP文件上传类实例详解
Apr 08 PHP
非常实用的php验证码类
May 15 PHP
CodeIgniter框架常见用法工作总结
Mar 16 PHP
解决出现SoapFault (looks like we got no XML document)的问题
Jun 24 PHP
thinkPHP框架通过Redis实现增删改查操作的方法详解
May 13 PHP
php apache开启跨域模式过程详解
Jul 08 PHP
PHP 实现 JSON 数据的编码和解码操作详解
Apr 22 PHP
PHP设计模式入门之状态模式原理与实现方法分析
Apr 26 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
一个从别的网站抓取信息的例子(域名查询)
2006/10/09 PHP
php数组应用之比较两个时间的相减排序
2008/08/18 PHP
PHP下使用mysqli的函数连接mysql出现warning: mysqli::real_connect(): (hy000/1040): ...
2016/02/14 PHP
PHP命名空间用法实例分析
2019/09/04 PHP
Javascript模块化编程(三)require.js的用法及功能介绍
2013/01/17 Javascript
Jquery的hide及toggle方法让超链接慢慢消失
2013/09/06 Javascript
jquery实现搜索框常见效果的方法
2015/01/22 Javascript
javascript操作表格排序实例分析
2015/05/06 Javascript
jQuery学习笔记之Ajax用法实例详解
2015/12/01 Javascript
javascript类型系统 Window对象学习笔记
2016/01/07 Javascript
JS面向对象编程详解
2016/03/06 Javascript
输入法的回车与消息发送快捷键回车的冲突解决方法
2016/08/09 Javascript
原生js实现手风琴功能(支持横纵向调用)
2017/01/13 Javascript
bootstrap——bootstrapTable实现隐藏列的示例
2017/01/14 Javascript
Vue动态组件与异步组件实例详解
2019/02/23 Javascript
node.js基于socket.io快速实现一个实时通讯应用
2019/04/23 Javascript
解决vue项目中出现Invalid Host header的问题
2020/11/17 Javascript
[56:35]DOTA2上海特级锦标赛C组小组赛#1 OG VS Archon第二局
2016/02/27 DOTA
Python标准异常和异常处理详解
2015/02/02 Python
简单实现python进度条脚本
2017/12/18 Python
python放大图片和画方格实现算法
2018/03/30 Python
python可视化实现代码
2019/01/15 Python
python几种常用功能实现代码实例
2019/12/25 Python
如何用css3实现switch组件开关的方法
2018/02/09 HTML / CSS
HMV日本官网:全球知名的音乐、DVD和电脑游戏零售巨头
2016/08/13 全球购物
欧舒丹比利时官网:L’OCCITANE比利时
2017/04/25 全球购物
Tenstickers法国:墙贴和装饰贴纸
2019/08/26 全球购物
法国一家多品牌成衣精品中/高档商店:Graduate Store
2019/08/28 全球购物
八皇后问题,输出了所有情况,不过有些结果只是旋转了90度
2016/08/15 面试题
超市客服工作职责
2014/06/11 职场文书
安全施工责任书
2014/08/25 职场文书
劳动纠纷调解协议书格式
2014/11/30 职场文书
小学中队活动总结
2015/05/11 职场文书
如何书写公司员工保密协议?
2019/06/27 职场文书
解决tk mapper 通用mapper的bug问题
2021/06/16 Java/Android
Python使用openpyxl批量处理数据
2021/06/23 Python