Apache - mod_rewrite规则详解

一,简介:

Apache的rewrite模块,提供了一个基于正则表达式规则的重写引擎,用来(on the fly)实时修改传入的请求的 URL 。因功能极其强大,被称为URL重写的“瑞士军刀”。

它支持无限的规则,以及为每个规则附加条件,从而提供了一个真正灵活且强大的 URL 操作机制。URL 操作可以依赖于各种测试,例如服务器变量,环境变量,HTTP 头,时间戳,甚至外部数据库查询等,以便完成 URL 单元匹配。

这个模块可以操作完整的 URL (包含目录信息部分和查询字符串部分) ,在服务器上下文 (httpd.conf)、虚拟主机上下文 (<VirtualHost> 指令块)、目录上下文 (.htaccess 文件和 <Directory> 指令块) 都可以配置。重写的结果 URL,可以指向一个站内的处理程序、指向站外的重定向或者一个站内的代理。

既然 mod_rewrite 这么强大,它当然是相当复杂。因此,别指望一天之内就能看懂整个模块。

二,打开Apache的rewrite功能

1、LoadModule
1)在windows环境下:
打开您的apache安装目录“/apache/conf/” 下的 httpd.conf 文件,通过Ctrl+F查找到LoadModule rewrite_module modules/mod_rewrite.so,将前面的”#”号删除即可
2)在linux环境下:
在编译 apache 的时候记得加上带 rewrite 模块。

2、让apache服务器支持.htaccess
在服务器或者虚拟主机的<Directory>配置段里,把你的AllowOverride配置设置成All,表示允许所有指令在 .htaccess 生效。

3、检查rewrite模块是否开启
当rewrite模块已经成功加载时,在phpinfo()里可以看到load的模块列表里有rewrite的名字。

三,特殊字符

1)$N,引用RewriteRule模板中匹配的相关字串,N表示序号,N=0..9
2)%N,引用最后一个RewriteCond模板中匹配的数据,N表示序号
3)%{VARNAME},服务器变量
4)${mapname:key|default},映射函数调用

四,指令

Apache Rewrite 的重写规则的具体指令共有 RewriteBase, RewriteCond, RewriteEngine, RewriteLock, RewriteLog, RewriteLogLevel, RewriteMap, RewriteOptions, RewriteRule 九个指令。

下面我们就最常用的RewriteEngine, RewriteBase, RewriteCond, RewriteRule这四个指令重点讲解。

1、RewriteEngine指令

原文 译文
描述(Description) Enables or disables runtime rewriting engine 开启或关闭重写引擎
语法(Syntax) RewriteEngine on|off
默认(Default) RewriteEngine off
作用域/上下文(Context) server config, virtual host, directory, .htaccess

2、RewriterRule规则
一条RewriteRule指令,定义一条重写规则,规则间的顺序非常重要。对Apache1.2及以后的版本,模板(pattern)是一个 POSIX正则式,用以匹配当前的URL。当前的URL不一定是用记最初提交的URL,因为可能用一些规则在此规则前已经对URL进行了处理。

原文 译文
描述(Description) Defines rules for the rewriting engine
语法(Syntax) RewriteRule Pattern Substitution [Flag1,Flag2,Flag3]
作用域/上下文(Context) server config, virtual host, directory, .htaccess

指令说明:匹配部分(Pattern) 是正则匹配URL的正则表达式(注意特殊字符需要转义处理), 可以在替换部分(Substitution)使用反向引用匹配部分的内容. 引用模式为: $N (N为1-9的整数)。

先说明一下一个比较特别的 Substitution 值: "-", 如果Substitution是 "-" 的话, 那么被请求的URL不会被修改掉,只做匹配检查。

在URL重写的匹配部分中,服务器会把请求的URL的一部分删除掉再传递给Pattern部分进行匹配,重写结束后再添加上去。所以平常我们看到的匹配规则总是不带网址前面的那些域名的什么东西的,也不带什么目录什么的,这些 apache已经给删掉了,处理完后再加到前面。但是有个例外,就是如果 Substitution 部分是带 http:// 开头的话, 那就直接重定向了,服务器不会把先前删除的再给加上了,不然就出错了。

查看几个官方的例子:
例如请求地址为: http://thishost/somepath/pathinfo, 看下面几种结果

Given Rule (重写规则) Resulting Substitution (替换结果)
^/somepath(.*) otherpath$1 invalid, not supported(无效的重写语句,不支持)
^/somepath(.*) otherpath$1 [R] invalid, not supported
^/somepath(.*) otherpath$1 [P] invalid, not supported
^/somepath(.*) /otherpath$1 /otherpath/pathinfo
^/somepath(.*) /otherpath$1 [R] http://thishost/otherpath/pathinfo via external redirection(外部重定向)
^/somepath(.*) /otherpath$1 [P] doesn't make sense, not supported
^/somepath(.*) http://thishost/otherpath$1 http://www.test.com/otherpath/pathinfo
^/somepath(.*) http://thishost/otherpath$1 [R] http://thishost/otherpath/pathinfo via external redirection(外部重定向)
^/somepath(.*) http://thishost/otherpath$1 [P] doesn't make sense, not supported
^/somepath(.*) http://otherhost/otherpath$1 http://otherhost/otherpath/pathinfo via external redirection(外部重定向)
^/somepath(.*) http://otherhost/otherpath$1 [R] http://otherhost/otherpath/pathinfo via external redirection (the [R] flag is redundant)(外部重定向,[R] 标志是多余的)
^/somepath(.*) http://otherhost/otherpath$1 [P] http://otherhost/otherpath/pathinfo via internal proxy(内部网关重定向)
还有 72% 的精彩内容
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 204,732评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 87,496评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 151,264评论 0 338
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,807评论 1 277
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,806评论 5 368
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,675评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,029评论 3 399
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,683评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 41,704评论 1 299
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,666评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,773评论 1 332
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,413评论 4 321
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,016评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,978评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,204评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,083评论 2 350
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,503评论 2 343

推荐阅读更多精彩内容

  • 重写规则 【重写规则的作用范围】 可以使用在Apache主配置文件httpd.conf中 可以使用在httpd.c...
    桖辶殇阅读 1,658评论 0 0
  • 看了一些关于.htaccess,apache重写url的规则,一般都写得很清楚。但是对于我一个小白,感觉要挖的东西...
    yancolin阅读 5,513评论 0 3
  • 此文章转载~ Apache伪静态(Rewrite).htaccess文件详解 Htaccess(超文本访问)是一个...
    bornfreekiss阅读 4,107评论 0 6
  • apache下的htaccess伪静态文件 bornfreekiss 关注 2017.10.23 11:17* 字...
    其实我很dou阅读 2,806评论 0 3
  • 前几天,偶和一位曾在体制内工作的年轻马头琴手聊天(他现早已转行)。在谈到马头琴时,他问我:为什么现在的他琴技早已退...
    陆春宁阅读 737评论 8 5