使用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调用Java对象的方法
Oct 09 PHP
PHP与SQL注入攻击[一]
Apr 17 PHP
php addslashes 函数详细分析说明
Jun 23 PHP
php array_map()数组函数使用说明
Jul 12 PHP
用mysql_fetch_array()获取当前行数据的方法详解
Jun 05 PHP
ThinkPHP的Widget扩展实例
Jun 19 PHP
PHP图形操作之Jpgraph学习笔记
Dec 25 PHP
php实现购物车产品删除功能(2)
Jul 23 PHP
Yii 2.0实现联表查询加搜索分页的方法示例
Aug 02 PHP
PHP JWT初识及其简单示例
Oct 10 PHP
不常用但很实用的PHP预定义变量分析
Jun 25 PHP
Yii框架where查询用法实例分析
Oct 22 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
四月新番又没了,《Re:从零开始的异世界生活》第二季延期至7月播出
2020/05/06 日漫
php项目打包方法
2008/02/18 PHP
PHP排序之二维数组的按照字母排序实现代码
2011/08/13 PHP
在php和MySql中计算时间差的方法详解
2015/03/27 PHP
详解WordPress中过滤链接与过滤SQL语句的方法
2015/12/18 PHP
Fleaphp常见函数功能与用法示例
2016/11/15 PHP
IE iframe的onload方法分析小结
2010/01/07 Javascript
javascript JSON操作入门实例
2010/04/16 Javascript
用js来解决ajax读取页面乱码
2010/11/28 Javascript
初识JQuery 实例一(first)
2011/03/16 Javascript
javascript 使td内容不换行不撑开
2012/11/29 Javascript
鼠标移动到图片名上,显示图片的简单实例
2013/07/14 Javascript
js 用CreateElement动态创建标签示例
2013/11/20 Javascript
两个select多选模式的选项相互移动(示例代码)
2014/01/11 Javascript
上传图片预览JS脚本 Input file图片预览的实现示例
2014/10/23 Javascript
JsRender for index循环索引用法详解
2014/10/31 Javascript
addEventListener()与removeEventListener()解析
2017/04/20 Javascript
BackBone及其实例探究_动力节点Java学院整理
2017/07/14 Javascript
深入探究angular2 UI组件之primeNG用法
2017/07/26 Javascript
ES6 javascript中class类的get与set用法实例分析
2017/10/30 Javascript
VUE2 前端实现 静态二级省市联动选择select的示例
2018/02/09 Javascript
微信小程序自定义导航栏
2018/12/31 Javascript
构建一个JavaScript插件系统
2020/10/20 Javascript
[56:00]DOTA2上海特级锦标赛主赛事日 - 4 胜者组决赛Secret VS Liquid第一局
2016/03/05 DOTA
详解Python中的静态方法与类成员方法
2017/02/28 Python
python里dict变成list实例方法
2019/06/26 Python
python计算无向图节点度的实例代码
2019/11/22 Python
浅谈keras保存模型中的save()和save_weights()区别
2020/05/21 Python
python实现测试工具(一)——命令行发送get请求
2020/10/19 Python
新西兰最大的天然保健及护肤品网站:HealthPost(直邮中国)
2021/02/13 全球购物
2014年药房工作总结
2014/11/22 职场文书
围城读书笔记
2015/06/26 职场文书
医务人员医德医风心得体会
2016/01/25 职场文书
2016年党员读书月活动总结
2016/04/06 职场文书
Python IO文件管理的具体使用
2022/03/20 Python
漫画「日和酱的要求是绝对的」第3卷封面公开
2022/03/21 日漫