使用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自动加载的两种实现方法
Jun 21 PHP
PHP数组遍历知识汇总(包含遍历方法、数组指针操作函数、数组遍历测速)
Jul 05 PHP
PHP strtotime函数用法、实现原理和源码分析
Feb 04 PHP
php类常量用法实例分析
Jul 09 PHP
php获取图片信息的方法详解
Dec 10 PHP
PHP使用数组依次替换字符串中匹配项
Jan 08 PHP
php安装ssh2扩展的方法【Linux平台】
Jul 20 PHP
PHP实现mysqli批量执行多条语句的方法示例
Jul 22 PHP
在Laravel5.6中使用Swoole的协程数据库查询
Jun 15 PHP
Yii框架函数简单用法分析
Sep 09 PHP
利用PHP内置SERVER开启web服务(本地开发使用)
Jan 22 PHP
Yii Framework框架开发微信公众平台示例
Apr 26 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
hessian 在PHP中的使用介绍
2010/12/13 PHP
PHP sprintf()函数用例解析
2011/05/18 PHP
PHP中的Memcache详解
2014/04/05 PHP
thinkphp使用phpmailer发送邮件的方法
2014/11/24 PHP
PHP实现断点续传乱序合并文件的方法
2018/09/06 PHP
IE和Firefox下javascript的兼容写法小结
2008/12/10 Javascript
jQuery EasyUI 的EasyLoader功能介绍
2010/09/12 Javascript
input:checkbox多选框实现单选效果跟radio一样
2014/06/16 Javascript
js命名空间写法示例
2015/12/18 Javascript
javascript运动框架用法实例分析(实现放大与缩小效果)
2016/01/08 Javascript
JavaScript数据结构之广义表的定义与表示方法详解
2017/04/12 Javascript
jQuery基于cookie实现换肤功能实例
2017/10/14 jQuery
vue实现点击当前标签高亮效果【推荐】
2018/06/22 Javascript
vue elementUI使用tabs与导航栏联动
2019/06/21 Javascript
微信小程序间使用navigator跳转传值问题实例分析
2020/03/27 Javascript
[41:56]Spirit vs Liquid Supermajor小组赛A组 BO3 第一场 6.2
2018/06/03 DOTA
Python实现的二维码生成小软件
2014/07/11 Python
Python装饰器(decorator)定义与用法详解
2018/02/09 Python
详解安装mitmproxy以及遇到的坑和简单用法
2019/01/21 Python
python实现桌面壁纸切换功能
2019/01/21 Python
python使用opencv实现马赛克效果示例
2019/09/28 Python
python 利用jinja2模板生成html代码实例
2019/10/10 Python
python中matplotlib实现随鼠标滑动自动标注代码
2020/04/23 Python
HTML实现代码雨源码及效果示例
2020/02/25 HTML / CSS
Lampegiganten丹麦:欧洲领先的照明网上商店
2018/04/25 全球购物
英国123鲜花网站:123 Flowers
2019/07/07 全球购物
介绍一下Java中标识符的命名规则
2014/02/03 面试题
优秀的2014年两会精神解读
2014/03/17 职场文书
幼儿园教师的考核评语
2014/04/18 职场文书
旷工检讨书1000字
2015/01/01 职场文书
2015年党员创先争优承诺书
2015/01/22 职场文书
关于召开会议的通知
2015/04/15 职场文书
解决jupyter notebook图片显示模糊和保存清晰图片的操作
2021/04/24 Python
详解Python 3.10 中的新功能和变化
2021/04/28 Python
Python进度条的使用
2021/05/17 Python
Elasticsearch 索引操作和增删改查
2022/04/19 Python