使用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 相关文章推荐
phpmyadmin导入(import)文件限制的解决办法
Dec 11 PHP
php getimagesize 上传图片的长度和宽度检测代码
May 15 PHP
php实现无限级分类实现代码(递归方法)
Jan 01 PHP
php小技巧 把数组的键和值交换形成了新的数组,查找值取得键
Jun 02 PHP
PHP冒泡排序算法代码详细解读
Jul 17 PHP
php文件怎么打开 如何执行php文件
Dec 21 PHP
header跳转和include包含问题详解
Sep 08 PHP
php无限遍历目录示例
Feb 21 PHP
php session的应用详细介绍
Mar 22 PHP
浅谈thinkphp5 instance 的简单实现
Jul 30 PHP
PHP ajax+jQuery 实现批量删除功能实例代码小结
Dec 06 PHP
ThinkPHP6.0如何利用自定义验证规则规范的实现登陆
Dec 16 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 快速排序算法详解
2014/11/10 PHP
php实现的Curl封装类Curl.class.php用法实例分析
2015/09/25 PHP
thinkphp3.x中变量的获取和过滤方法详解
2016/05/20 PHP
PHP机器学习库php-ml的简单测试和使用方法
2017/07/14 PHP
ThinkPHP 3.2.3实现页面静态化功能的方法详解
2017/08/03 PHP
更优雅的事件触发兼容
2011/10/24 Javascript
引用外部js乱码问题分析及解决方案
2013/04/12 Javascript
div当滚动到页面顶部的时候固定在顶部实例代码
2013/05/27 Javascript
基于JavaScript怎么实现让歌词滚动播放
2015/11/03 Javascript
BootStrap3中模态对话框的使用
2017/01/06 Javascript
微信小程序与php 实现微信支付的简单实例
2017/06/23 Javascript
基于JavaScript实现数码时钟效果
2020/03/30 Javascript
vue 做移动端微信公众号采坑经验记录
2018/04/26 Javascript
nuxt中使用路由守卫的方法步骤
2019/01/27 Javascript
Vue3.0数据响应式原理详解
2019/10/09 Javascript
Echarts实现单条折线可拖拽效果
2019/12/19 Javascript
[16:01]夜魇凡尔赛茶话会 第二期01:你比划我猜
2021/03/11 DOTA
python利用elaphe制作二维条形码实现代码
2012/05/25 Python
Python中自定义函数的教程
2015/04/27 Python
将Python的Django框架与认证系统整合的方法
2015/07/24 Python
使用Python实现从各个子文件夹中复制指定文件的方法
2018/10/25 Python
python3.5安装python3-tk详解
2019/04/26 Python
pytorch实现mnist分类的示例讲解
2020/01/10 Python
Python高并发和多线程有什么关系
2020/11/14 Python
html5 canvas里绘制椭圆并保持线条粗细均匀的技巧
2013/03/25 HTML / CSS
英国IT硬件供应商,定制游戏PC:Mesh Computers
2019/03/28 全球购物
英国领先的互联网葡萄酒礼品商:Vintage Wine & Port
2019/05/24 全球购物
化学教师自荐信范文
2013/12/28 职场文书
学雷锋活动总结范文
2014/04/25 职场文书
政府法律服务方案
2014/06/14 职场文书
低碳日宣传活动总结
2014/07/09 职场文书
2014年群众路线党员自我评议
2014/09/24 职场文书
支部书记四风问题对照检查材料
2014/10/04 职场文书
Nginx配置之实现多台服务器负载均衡
2021/08/02 Servers
MySQL 分区表中分区键为什么必须是主键的一部分
2022/03/17 MySQL
Java实现HTML转为Word的示例代码
2022/06/28 Java/Android