zoukankan      html  css  js  c++  java
  • RewriteCond与RewriteRule用法

    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]

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

  • 相关阅读:
    LeetCode OJ 112. Path Sum
    LeetCode OJ 226. Invert Binary Tree
    LeetCode OJ 100. Same Tree
    LeetCode OJ 104. Maximum Depth of Binary Tree
    LeetCode OJ 111. Minimum Depth of Binary Tree
    LeetCode OJ 110. Balanced Binary Tree
    apache-jmeter-3.1的简单压力测试使用方法(下载和安装)
    JMeter入门教程
    CentOS6(CentOS7)设置静态IP 并且 能够上网
    分享好文:分享我在阿里8年,是如何一步一步走向架构师的
  • 原文地址:https://www.cnblogs.com/my2018/p/10675976.html
Copyright © 2011-2022 走看看