Rewrite重写任务基本上都是由RewriteCond和RewriteRule两个命令配合完成。

首先看一段简单代码:

[Shell] 纯文本查看 复制代码
1
2
3
RewriteBase /
RewriteCond %{http_host} ^softwhy.com$ [NC]
RewriteRule ^(.*)$ http://www.softwhy.com/$1 [R=301]

下面对上述代码做一下分析:

(1).RewriteBase /规定根目录为基准路径,具体参阅.htaccess RewriteBase用法一章节。

(2).RewriteCond规定重写的条件,如果条件成立,那么将会执行RewriteRule所规定的重写规则。

具体代码细节,后面会做介绍,它实现不带www的URL跳转到带有www的URL,比如:

[Shell] 纯文本查看 复制代码
1
2
3
softwhy.com/article-451-1.html
# 跳转到如下链接
www.softwhy.com/article-451-1.html

一.RewriteCond命令:

它用来定义重写规则执行的条件。

语法结构:

[Shell] 纯文本查看 复制代码
1
RewriteCond String Pattern [flags]

定义一个条件,当String所规定的内容与Pattern规则匹配时,才会执行RewriteRule规定重写。

参数解析:

1.String:纯文本的字符串,除了包含普通的字符外,还可以包括下列的可扩展结构:

(1).$N:RewriteRule后向引用。$N引用紧跟在RewriteCond之后的RewriteRule中Pattern的小括号中的规则在当前URL中匹配的内容。N是0 <= N <= 9之间的整数。

(2).%N:RewriteCond后向引用 。%N引用最后一个RewriteCond的Pattern中的小括号中的规则在当前URL中匹配的内容。N是0 <= N <= 9之间的整数。

2.Pattern:应用于当前实例TestString的正则表达式 ,还可以包括以下扩展:

(1).!:表示TestString不与当前正则匹配;格式是!CondPattern。

(2).>: 将condPattern作为普通字符串与String比较,String大于Pattern为真;格式是>Pattern。

(3).=:将condPattern作为普通字符串与String比较,String与Pattern相同时为真;格式是=Pattern。

(4).-d:将String当作一个目录名,检查它是否存在以及是否是一个目录;格式是-d。

(5).-f:将String当作一个文件名,检查它是否存在以及是否是一个文件;格式是-f。

(6).-s:将String当作一个文件名,检查它是否存在以及是否是一个长度大于0的文件;格式是-s。

(7).-l: 将String当作一个文件名,检查它是否存在以及是否是一个 symbolic link;格式是-l。

(8).-F:检查String是否是一个合法的文件,而且通过服务器范围内的当前设置的访问控制进行访问。检查通过一个内部subrequest完成的, 因此需要谨慎使用,以防止降低服务器的性能。

(9).-U:检查String是否是一个合法的URL,而且通过服务器范围内的当前设置的访问控制进行访问。检查通过一个内部subrequest完成的, 因此需要谨慎使用,以防止降低服务器的性能。

3.[flags]:多个标志之间用逗号分隔。

(1).NC:表示不区分大小写。

(2).OR:默认的情况下,二个条件之间是AND的关系,用这个标志将关系改为OR。

二.RewriteRule命令:

它用来规定当RewriteCond条件满足时要执行的规则。

语法结构:

[Shell] 纯文本查看 复制代码
1
RewriteRule Pattern Substitution [flags]

参数解析:

1.Pattern:作用于当前URL的正则表达式;此url不包含协议、域名和查询字符串部分。

2.Substitution:当RewriteCond满足时,用来替换原始URL指定内容的字符串,还可以包括以下扩展:

(1).$N:RewriteRule后向引用。$N引用紧跟在RewriteCond之后的RewriteRule中Pattern的小括号中的规则在当前URL中匹配的内容。N是0 <= N <= 9之间的整数。

(2).%N:RewriteCond后向引用 。%N引用最后一个RewriteCond的Pattern中的小括号中的规则在当前URL中匹配的内容。N是0 <= N <= 9之间的整数。

3.[flags]:多个标志之间用逗号分隔,下面是常见的一些flag:

(1).R:表示重定性,[R=301]表示301重定向,默认是302重定向。

(2).F:强制当前URL为被禁止的,即,立即反馈一个HTTP响应代码403(被禁止的)。

(3).G:强制当前URL为已废弃的,即,立即反馈一个HTTP响应代码410(已废弃的)。

(4).L:立即停止重写操作,并不再应用其他重写规则。

(5).N:重新执行重写操作(从第一个规则重新开始). 这时再次进行处理的URL已经不是原始的URL了,而是经最后一个重写规则处理的URL。

(6).C:此标记使当前规则与下一个(其本身又可以与其后继规则相链接的, 并可以如此反复的)规则相链接。 它产生这样一个效果: 如果一个规则被匹配,通常会继续处理其后继规则, 即,这个标记不起作用;如果规则不能被匹配,则其后继的链接的规则会被忽略。

(7).NC:忽略大小写。

(8).QSA:此标记强制重写引擎在已有的替换串中追加一个请求串,而不是简单的替换。

代码实例:

[Shell] 纯文本查看 复制代码
1
2
RewriteCond %{http_host} ^softwhy.com$ [NC]
RewriteRule ^(.*)$ www.softwhy.com/$1 [R=301]

代码解析如下:

(1).RewriteCond用来规定执行后面重写的条件。

(2).%{http_host}是一个服务器变量,可以获取访问的域名,如果域名是"softwhy.com",添加成立。

(3).RewriteRule规定当RewriteCond条件成立索要执行的重写规则。

(4).^(.*)$获取URL除去协议、域名和查询字符串部分,比如softwhy.com/forum.php?mod=viewthread&tid=1,只获取forum.php部分,域名和查询部分不会被获取,如果要获取可以参阅RewriteRule QSA用法一章节。

(5).$1表示^(.*)$小括号所匹配的内容,$2表示第二个小括号所匹配的内容,以此类推。

(6).[R=301]表示原始网址重定向为后来重写的网址。

(7).用softwhy.com/forum.php?mod=viewthread&tid=1访问,softwhy.com/forum.php被www.softwhy.com/forum.php替换,最终是以www.softwhy.com/forum.php?mod=viewthread&tid=1访问页面。

[Shell] 纯文本查看 复制代码
1
2
RewriteCond %{HTTP_HOST} ^(.+)\.google\.com$  
RewriteRule ^/([\w]+)/([\d]+)$ /service/detail\.html\?id=$1&date=$2&c=%1 [L]

代码分析如下:

(1).%{HTTP_HOST}获取域名。

(2).^(.+)\.google\.com$表示任何以google.com为根域名的域名。

(3).^/([\w]+)/([\d]+)$获取访问url两个斜线之间的部分,比如a/b/x.php,那么将会获取a/b。

(4).$1获取^/([\w]+)/([\d]+)$第一个小括号匹配的内容。

(5).$2获取^/([\w]+)/([\d]+)$第二个小括号匹配的内容。

(6).%1获取^(.+)\.google\.com$第一个小括号匹配的内容。

[Shell] 纯文本查看 复制代码
1
RewriteRule forum.php?mod=viewthread&tid=100 article-2094-1.html [R=301]

本意是,链接(www.)softwhy.comforum.php?mod=viewthread&tid=100跳转到(www.)softwhy.article-2094-1.html,但是结果却非常让人失望,最后结果如下:

[Shell] 纯文本查看 复制代码
1
(www.)softwhy.article-2094-1.html??mod=viewthread&tid=100

如果Substitution没有查询字符串部分,那么它附加原来URL查询字符串部分。

代码修改如下:

[Shell] 纯文本查看 复制代码
1
RewriteRule forum.php?mod=viewthread&tid=100 article-2094-1.html? [R=301]

再后面添加一个问号即可。

转载于:https://www.cnblogs.com/my2018/p/10675976.html

RewriteCond与RewriteRule用法相关推荐

  1. 全面理解.htaccess语法中RewriteCond和RewriteRule意义

    全面理解.htaccess语法中RewriteCond和RewriteRule意义 .htaccess 配置文件可以通过RewriteCond 和 RewriteRule 实现伪静态. Rewrite ...

  2. Apache的URL地址重写 RewriteCond与RewriteRule

    Apache的URL地址重写 http://hi.baidu.com/sonan/blog/item/c408963d89468208bba16716.html 第一种方法:Apache环境中如果要将 ...

  3. Apache的URL地址重写(RewriteCond与RewriteRule)

    Apache的URL地址重写 http://hi.baidu.com/sonan/blog/item/c408963d89468208bba16716.html 第一种方法:Apache环境中如果要将 ...

  4. PHP RewriteRule用法

    Apache的URL地址重写 http://hi.baidu.com/sonan/blog/item/c408963d89468208bba16716.html 第一种方法:Apache环境中如果要将 ...

  5. RewriteCond 和RewriteRule

    Apache的Mod_rewrite学习 (RewriteCond重写规则的条件)收藏 RewriteCond Syntax: RewriteCond TestString CondPattern [ ...

  6. RewriteCond 和RewriteRule

    Apache的Mod_rewrite学习 (RewriteCond重写规则的条件)收藏 RewriteCond Syntax: RewriteCond TestString CondPattern [ ...

  7. URL重写:RewriteCond指令与RewriteRule 指令格式(转)

    Rewirte主要的功能就是实现URL的跳转和隐藏真实地址,基于Perl语言的正则表达式规范.平时帮助我们实现拟静态,拟目录,域名跳转,防止盗链等.本文将针对mod_rewrite和URL匹配的技术细 ...

  8. URL重写:RewriteCond指令与RewriteRule 指令格式

    Rewirte主要的功能就是实现URL的跳转和隐藏真实地址,基于Perl语言的正则表达式规范.平时帮助我们实现拟静态,拟目录,域名跳转,防止盗链等.本文将针对mod_rewrite和URL匹配的技术细 ...

  9. Apache中RewriteRule和RewriteCond规则参数的详细介绍

    RewriteCond就像我们程序中的if语句一样,表示如果符合某个或某几个条件则执行RewriteCond下面紧邻的RewriteRule语句,这就是RewriteCond最原始.基础的功能,为了方 ...

最新文章

  1. 重磅!我国建成首个自动驾驶封闭高速公路测试环境
  2. Hbase 学习(六) 配置文件调优
  3. optee中的中断处理详解
  4. mysql组合索引的命中情况
  5. Adobe 中国区 "Adobe RIA 开发工程师认证考试" 正式发布
  6. 2014 计算机网络 考研真题,2014计算机网络考研试题过关必练
  7. DB2的ErrorCode
  8. php 中访问常量,php 中的常量
  9. w3cschool php下载_w3cschool下载_W3Cschool v2.0离线版
  10. Java 编程(基础面试题)
  11. 华为手机使用HiSuite升级和降级刷机方法
  12. 唐峻:互联网内容产业永远有机会
  13. 如何屏幕高清录像?--QVE屏幕录制
  14. 其实装修也是工程管理
  15. systools ssd data recovery怎么用呢
  16. 申请支付宝-Alipay 密钥流程
  17. python字典一键多值如何遍历_[宜配屋]听图阁
  18. android自动拨号112,自动拨号打电话助手
  19. (五)深入理解蓝牙BLE之“Beacon包格式详解”
  20. 迪文串口屏(T5L2 DGUS II)开发 -- 入门

热门文章

  1. vr制作软件是什么,常用都是哪几个?
  2. 显示GridControl的横向滚动条
  3. 计算机一级总产量怎么算,excel表格数据增长百分比-Excel表格如何计算产量增减百分比?...
  4. 【IOT开发】蓝牙模块与PC连接通讯实验
  5. Java学习笔记:案例:对英语真题进行词频分析
  6. 我发布了自己第一个由ChatGPT辅助开发的开源项目goattribute
  7. PHP计算两个经纬度之间的距离
  8. Windows操作快捷键大全
  9. Q-learning算法辅助求解柔性作业车间调度问题--附带源码测试集模型
  10. Python装饰器简单练习01