使用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 相关文章推荐
MySQL相关说明
Jan 15 PHP
Zend Studio for Eclipse的java.lang.NullPointerException错误的解决方法
Dec 06 PHP
PHP中return 和 exit 、break和contiue 区别与用法
Apr 09 PHP
深入理解PHP之数组(遍历顺序)  Laruence原创
Jun 13 PHP
PHP笔记之:日期函数的使用介绍
Apr 24 PHP
PHP删除目录及目录下所有文件的方法详解
Jun 06 PHP
PHP解决URL中文GBK乱码问题的两种方法
Jun 03 PHP
合并ThinkPHP配置文件以消除代码冗余的实现方法
Jul 22 PHP
php 猴子摘桃的算法
Jun 20 PHP
laravel 实现上传图片到本地和前台访问示例
Oct 21 PHP
2020最新版 PhpStudy V8.1版本下载安装使用详解
Oct 30 PHP
TP - 比RBAC更好的权限认证方式(Auth类认证)
Mar 09 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 一个比较完善的简单文件上传
2010/03/25 PHP
Laravel5.5 动态切换多语言的操作方式
2019/10/25 PHP
网页常用特效代码整理
2006/06/23 Javascript
基于jquery的防止大图片撑破页面的实现代码(立即缩放)
2011/10/24 Javascript
分享精心挑选的23款美轮美奂的jQuery 图片特效插件
2012/08/14 Javascript
js验证电话号码与手机支持+86的正则表达式
2014/01/23 Javascript
javascript 原型链维护和继承详解
2014/11/26 Javascript
JavaScript中String.match()方法的使用详解
2015/06/06 Javascript
Bootstrap每天必学之表格
2015/11/23 Javascript
Javascript对象字面量的理解
2016/06/22 Javascript
基于node下的http小爬虫的示例代码
2018/01/11 Javascript
vuex实现登录状态的存储,未登录状态不允许浏览的方法
2018/03/09 Javascript
vue单页应用的内存泄露定位和修复问题小结
2019/08/02 Javascript
Vue执行方法,方法获取data值,设置data值,方法传值操作
2020/08/05 Javascript
vue 封装面包屑组件教程
2020/11/16 Javascript
[57:18]DOTA2上海特级锦标赛主赛事日 - 1 败者组第一轮#3VP VS VG
2016/03/03 DOTA
python实现sublime3的less编译插件示例
2014/04/27 Python
Python的网络编程库Gevent的安装及使用技巧
2016/06/24 Python
使用Python实现正态分布、正态分布采样
2019/11/20 Python
Python PyPDF2模块安装使用解析
2020/01/19 Python
python db类用法说明
2020/07/07 Python
python 如何调用远程接口
2020/09/11 Python
python logging模块的使用详解
2020/10/23 Python
IE矩阵Matrix滤镜旋转与缩放及如何结合transform
2012/11/29 HTML / CSS
德国在线订购鲜花:Fleurop
2018/08/25 全球购物
ShellScript面试题一则-ShellScript编程
2014/03/05 面试题
董事长秘书岗位职责
2013/11/29 职场文书
酒店出纳岗位职责
2013/12/29 职场文书
单位创先争优活动方案
2014/01/26 职场文书
党员批评与自我批评
2014/02/12 职场文书
法学院毕业生求职信
2014/06/25 职场文书
2014年小学教学工作总结
2014/11/13 职场文书
2015年八一建军节活动总结
2015/03/20 职场文书
元旦主持词开场白
2015/05/29 职场文书
2016秋季运动会前导词
2015/11/25 职场文书
学习计划是什么
2019/04/30 职场文书