使用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函数的常用方法及注意之处小结
Jul 10 PHP
php三维数组去重(示例代码)
Nov 26 PHP
php判断数组元素中是否存在某个字符串的方法
Jun 14 PHP
PHP中exec与system用法区别分析
Sep 22 PHP
php实现每天自动变换随机问候语的方法
May 12 PHP
php简单实现批量上传图片的方法
May 09 PHP
PHP生成可点击刷新的验证码简单示例
May 13 PHP
详解PHP中cookie和session的区别及cookie和session用法小结
Jun 12 PHP
php mysqli查询语句返回值类型实例分析
Jun 29 PHP
Yii2框架实现登陆添加验证码功能示例
Jul 12 PHP
PHP添加PNG图片背景透明水印操作类定义与用法示例
Mar 12 PHP
laravel 解决Validator使用中出现的问题
Oct 25 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
laravel框架实现后台登录、退出功能示例
2019/10/31 PHP
JavaScript实现拼音排序的方法
2012/11/20 Javascript
ExtJs默认的字体大小改变的几种方法(自己整理)
2013/04/18 Javascript
jquery实现弹出div,始终显示在屏幕正中间的简单实例
2014/03/08 Javascript
jquery控制表单输入框显示默认值的方法
2015/05/22 Javascript
JQuery EasyUI Layout 在from布局自适应窗口大小的实现方法
2016/05/28 Javascript
JS中闭包的经典用法小结(2则示例)
2016/12/28 Javascript
解析jquery easyui tree异步加载子节点问题
2017/03/08 Javascript
js中的DOM模拟购物车功能
2017/03/22 Javascript
详解vue-cli与webpack结合如何处理静态资源
2017/09/19 Javascript
Angular父组件调用子组件的方法
2018/04/02 Javascript
Mint UI组件库CheckList使用及踩坑总结
2018/12/20 Javascript
Javascript confirm多种使用方法解析
2020/09/25 Javascript
原生JavaScript实现幻灯片效果
2021/02/19 Javascript
Python的shutil模块中文件的复制操作函数详解
2016/07/05 Python
Python用 KNN 进行验证码识别的实现方法
2018/02/06 Python
python实现装饰器、描述符
2018/02/28 Python
Python基于Floyd算法求解最短路径距离问题实例详解
2018/05/16 Python
python模块之subprocess模块级方法的使用
2019/03/26 Python
Python函数中参数是传递值还是引用详解
2019/07/02 Python
基于Pycharm加载多个项目过程图解
2020/01/19 Python
pycharm第三方库安装失败的问题及解决经验分享
2020/05/09 Python
Python 下载Bing壁纸的示例
2020/09/29 Python
瑞贝卡·明可弗包包官网:Rebecca Minkoff
2016/07/21 全球购物
乌克兰最大的家用电器和电子产品连锁店:Eldorado
2019/10/02 全球购物
毕业自荐信
2013/12/16 职场文书
2014年污水处理厂工作总结
2014/12/19 职场文书
还款承诺书范本
2015/01/20 职场文书
天那边观后感
2015/06/09 职场文书
2015年音乐教研组工作总结
2015/07/22 职场文书
使用python如何删除同一文件夹下相似的图片
2021/05/07 Python
如何用Laravel包含你自己的帮助函数
2021/05/27 PHP
MySQL系列之九 mysql查询缓存及索引
2021/07/02 MySQL
python之PySide2安装使用及QT Designer UI设计案例教程
2021/07/26 Python
《吸血鬼幸存者》新内容发布 追加多个全新模式
2022/04/07 其他游戏
Vue3实现简易音乐播放器组件
2022/08/14 Vue.js