使用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 flock 文件锁详细介绍
Dec 29 PHP
PHP中include与require使用方法区别详解
Oct 19 PHP
PHP写的资源下载防盗链类分享
May 12 PHP
php获取url参数方法总结
Nov 13 PHP
CodeIgniter扩展核心类实例详解
Jan 20 PHP
php使用Header函数,PHP_AUTH_PW和PHP_AUTH_USER做用户验证
May 04 PHP
php blowfish加密解密算法
Jul 02 PHP
轻松实现php文件上传功能
Feb 17 PHP
php实现的双色球算法示例
Jun 20 PHP
基于 Swoole 的微信扫码登录功能实现代码
Jan 15 PHP
Laravel如何使用Redis共享Session
Feb 23 PHP
laravel Validator ajax返回错误信息的方法
Sep 29 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读取excel文件的简单实例
2013/08/26 PHP
php经典趣味算法实例代码
2020/01/21 PHP
在视频前插入广告
2006/11/20 Javascript
javascript 继承实现方法
2009/08/26 Javascript
本地对象Array的原型扩展实现代码
2010/12/04 Javascript
Jquery实现搜索框提示功能示例代码
2013/08/13 Javascript
js中的referrer返回上一页使用介绍
2013/09/26 Javascript
ie与ff下的event事件使用介绍
2013/11/25 Javascript
千分位数字格式化(用逗号隔开 代码已做了修改 支持0-9位逗号隔开)的JS代码
2013/12/05 Javascript
js生成随机数之random函数随机示例
2013/12/20 Javascript
ie 7/8不支持trim的属性的解决方案
2014/05/23 Javascript
Nodejs极简入门教程(二):定时器
2014/10/25 NodeJs
创建、调用JavaScript对象的方法集锦
2014/12/24 Javascript
使用js画图之正弦曲线
2015/01/12 Javascript
微信小程序中使元素占满整个屏幕高度实现方法
2016/12/14 Javascript
bootstrap弹出层的多种触发方式
2017/05/10 Javascript
JS二分查找算法详解
2017/11/01 Javascript
判断div滑动到底部的scroll实例代码
2017/11/15 Javascript
详解nodejs 开发企业微信第三方应用入门教程
2019/03/12 NodeJs
将Python中的数据存储到系统本地的简单方法
2015/04/11 Python
详解Python字符串对象的实现
2015/12/24 Python
python+ffmpeg视频并发直播压力测试
2018/03/06 Python
用Python分析3天破10亿的《我不是药神》到底神在哪?
2018/07/12 Python
python opencv读mp4视频的实例
2018/12/07 Python
Python列表(List)知识点总结
2019/02/18 Python
浅谈Python3多线程之间的执行顺序问题
2020/05/02 Python
Python程序慢的重要原因
2020/09/04 Python
CSS3实现多重边框的方法总结
2016/05/31 HTML / CSS
AmazeUI 平滑滚动效果的示例代码
2020/08/20 HTML / CSS
NUK奶瓶美国官网:NUK美国
2016/09/26 全球购物
经管应届生求职信
2013/11/17 职场文书
会计系个人求职信范文分享
2013/12/20 职场文书
秘书行业自我鉴定范文
2013/12/30 职场文书
业务内勤岗位职责
2014/04/30 职场文书
医学生求职自荐书
2014/06/12 职场文书
2014年绩效考核工作总结
2014/12/11 职场文书