Apache中RewriteCond规则参数介绍

Apache中RewriteCond规则参数介绍CodeIgniter2 0 已经出来有 20 多天了呢 也就是我一直用的 php 框架 CI 一直都在研究 jquery 倒是把 CI 给忘到一边去了 呵呵 今天公司事情不是很多 于是开始熟悉一下 CI2 0 的一些新特性 刚好也再温习一遍 CI 的一些特性 早上看的东西不多 其中有这么一点知识 CI 中默认情况下 index php 文件将被包含在你的 URL 中的 如果想要从 url 中删除这个默认的 index ph

CodeIgniter2.0已经出来有20多天了呢~也就是我一直用的php框架(CI)。一直都在研究jquery,倒是把CI给忘到一边去了,呵呵~~今天公司事情不是很多,于是开始熟悉一下CI2.0的一些新特性~~刚好也再温习一遍CI的一些特性。早上看的东西不多,其中有这么一点知识,CI中默认情况下index.php 文件将被包含在你的URL中的,如果想要从url中删除这个默认的index.php,那么就需要用到Apache的强大的Rewrite功能了。

CI的官方文档中给出的解决办法是这样的:

创建.htaccess 文件放到网站的根目录下,文件中的内容如下:

?
1
2
RewriteCond $1 !^(index.php|images|robots.txt)
RewriteRule ^(.*)$ /index.php/$1 [L]

呵呵~~由于本人对Appache的这些规则也没怎么深入的研究过,于是在网上找了点关于这个appache的RewriteCond的一点资料,觉得写得不错很详细,现分享于大家:

?
1
2
3
4
5
6
7
8
RewriteEngine on
RewriteCond  %{HTTP_USER_AGENT}  ^Mozilla/5.0.*
RewriteRule  index.php            index.m.php
 
RewriteCond  %{HTTP_USER_AGENT}  ^Lynx.*
RewriteRule  index.php            index.L.php
 
RewriteRule  index.php            index.b.php

上 面语句的作用是当你是用FF浏览器访问index.php这个文件的时候,会自动让你访问到index.m.php这个文件,当你是用一些移动终端访问的 时候,会让你对index.php这个文件的访问实际访问的是index.L.php去,如果你是用其它的浏览器访问的时候,会让你跳到 index.b.php。在说形象一点,上面的语句就等同于程序里面的下面语句(依PHP语句为例):

?
1
2
3
4
5
6
7
8
9
10
if
(
$_SERVER
[
'HTTP_USER_AGENT'
] ==
'Mozilla/5.0'
)
{
//跳转到对index.m.php的访问
}
else
if
(
$_SERVER
[
'HTTP_USER_AGENT'
] ==
'Lynx'
)
{
//跳转到对index.L.php的访问
}
else
//跳转到对index.b.php的访问

再看例2:

?
1
2
RewriteCond %{HTTP_REFERER} (www.test.cn)
RewriteRule (.*)$ test.php

上面语句的作用是如果你访问的上一个页面的主机地址是www.test.cn,则无论你当前访问的是哪个页面,都会跳转到对test.php的访问。

再看例三:

?
1
2
3
4
RewriteCond %{REMOTE_HOST} ^host1.* [OR]
RewriteCond %{REMOTE_HOST} ^host2.* [OR]
RewriteCond %{REMOTE_HOST} ^host3.*
RewriteRule (.*)$ test.php

上面语句的作用是如果你的地址是host1或host2或host3的时候,则就跳到对test.php。从这里可以看出,RewriteCond语句之间默认的是AND,如果想要OR,则要明确的写出来。

下面是自己收藏的一些有用的重写规则:

?
1
2
3
4
5
RewriteCond %{REQUEST_FILENAME} !-f   //如果文件存在,就直接访问文件,不进行下面的RewriteRule.(不是文件或文件不存在就执行重写)
 
RewriteCond %{REQUEST_FILENAME} !-d   //#如果目录存在就直接访问目录不进行RewriteRule
 
RewriteCond %{REQUEST_URI} !^.*(.css|.js|.gif|.png|.jpg|.jpeg)$ //#如果是这些后缀的文件,就直接访问文件,不进行Rewrite

RewriteCond指令格式

RewriteCond指令定义一条规则条件。在一条RewriteRule指令前面可能会有一条或多条RewriteCond指令,只有当RewriteCond的条件(CondPattern)匹配成功时,RewriteRule的重写规则才被应用于当前URL处理。

TestString是一个纯文本的字符串,除了包含普通的字符外,还可以包括下列的变量结构扩展:

RewriteMap扩展:引用方法是:${mapname:key|default} 细节请参见RewriteMap指令 。

TestString可以包含服务器变量 ,引用方法是:%{
NAME_OF_VARIABLE}

NAME_OF_VARIABLE可以是下表列出的字符串之一:

HTTP头连接与请求 服务器自身 日期和时间 其它
HTTP_USER_AGENT DOCUMENT_ROOT TIME_YEAR API_VERSION
HTTP_REFERER SERVER_ADMIN TIME_MON THE_REQUEST
HTTP_COOKIE SERVER_NAME TIME_DAY REQUEST_URI
HTTP_FORWARDED SERVER_ADDR TIME_HOUR REQUEST_FILENAME
HTTP_HOST SERVER_PORT TIME_MIN IS_SUBREQ
HTTP_PROXY_CONNECTION SERVER_PROTOCOL TIME_SEC HTTPS
HTTP_ACCEPT SERVER_SOFTWARE TIME_WDAY  
REMOTE_ADDR   TIME  
REMOTE_HOST      
REMOTE_PORT      
REMOTE_USER      
REMOTE_IDENT      
REQUEST_METHOD      
SCRIPT_FILENAME      
PATH_INFO      
QUERY_STRING      
AUTH_TYPE      

这些变量都对应于类似命名的HTTP MIME头、Apache服务器的C变量、Unix系统中的struct tm字段,其中的大多数在其他的手册或者CGI规范中都有说明。 其中有mod_rewrite所特有的变量如下:

IS_SUBREQ

如果正在处理的请求是一个子请求,它将包含字符串”true”,否则就是”false”。 模块为了解析URI中的附加文件,可能会产生子请求。

API_VERSION

这是正在使用中的Apache模块API(服务器和模块之间内部接口)的版本, 其定义位于include/ap_mmn.h中。 此模块API版本对应于正在使用的Apache的版本(比如在Apache 1.3.14的发行版中这个值是:10)。 通常,对它感兴趣的是模块的开发者。

THE_REQUEST

这是由浏览器发送的完整的HTTP请求行(比如:”GET /index.html HTTP/1.1″)。 它不包含任何浏览器发送的其它头信息。

REQUEST_URI

这是在HTTP请求行中所请求的资源(比如上述例子中的”/index.html”)。

REQUEST_FILENAME

这是与请求相匹配的完整的本地文件系统的文件路径名。

HTTPS

如果连接使用了SSL/TLS,它将包含字符串”on”,否则就是”off”(无论mod_ssl 是否已经加载,该变量都可以安全的使用)。

其它注意事项:

SCRIPT_FILENAME和REQUEST_FILENAME包含的值是相同的——即Apache服务器内部的request_rec结构中的 filename字段。 第一个就是大家都知道的CGI变量名,而第二个则是REQUEST_URI(request_rec结构中的uri字段)的一个副本。

  1. 特殊形式:%{ENV:variable} ,其中的variable可以是任意环境变量。 它是通过查找Apache内部结构或者(如果没找到的话)由Apache服务器进程通过getenv()得到的。
  2. 特殊形式:%{SSL:variable} ,其中的variable可以是一个SSL环境变量 的名字,无论mod_ssl 模块是否已经加载都可以使用(未加载时为空字符串)。 比如:%{SSL:SSL_CIPHER_USEKEYSIZE}将会被替换为128。
  3. 特殊形式:%{HTTP:header} ,其中的header可以是任意HTTP MIME头的名称。 它总是可以通过查找HTTP请求而得到。 比如:%{HTTP:Proxy-Connection}将被替换为Proxy-Connection:HTTP头的值。
  4. 预设形式:%{LA-U:variable} ,variable的最终值在执行一个内部(基于URL的)子请求后确定。 当需要使用一个目前未知但是会在之后的过程中设置的变量的时候,就可以使用这个方法。 例如,需要在服务器级配置(httpd.conf文件)中根据REMOTE_USER变量进行重写, 就必须使用%{LA-U:REMOTE_USER}。 因为此变量是由URL重写(mod??_rewrite)步骤之后的认证步骤设置的。 但是另一方面,因为mod_rewrite是通过API修正步骤来实现目录级(.htaccess文件)配置的, 而认证步骤先于API修正步骤,所以可以用%{REMOTE_USER}。
  5. 预设形式:%{LA-F:variable} ,variable的最终值在执行一个内部(基于文件名的)子请求后确定。 大多数情况下和上述的LA-U是相同的。

●CondPattern是条件模式,即一个应用于当前TestString实例的正则表达式。TestString将被首先计算,然后再与CondPattern匹配。

注意:CondPattern是一个perl兼容的正则表达式,但是还有若干增补:



将CondPattern视为纯字符串,与TestString按词典顺序进行比较。 如果TestString等于CondPattern(两个字符串逐个字符地完全相等)则为真。

●在CondPattern之后追加特殊的标记[flags] 作为RewriteCond指令的第三个参数。flags是一个以逗号分隔的以下标记的列表:

“nocase|NC”—————(忽略大小写)

代码简写 全写 解释
R[=code]  redirect 强制外部重定向
F  forbidden 禁用URL,返回403HTTP状态码。
G  gone 强制URL为已废弃的
P  proxy 强制使用代理转发。
L  last 表明当前规则是最后一条规则,停止分析以后规则的重写。
N  next 重新从第一条规则开始运行重写过程。
C  chain 与下一条规则关联
如果规则匹配则正常处理,该标志无效,如果不匹配,那么下面所有关联的规则都跳过。
T=MIME-type  type 强制MIME类型
NS  nosubreq 只用于不是内部子请
NC  nocase 不区分大小写
QSA  qsappend 追加请求字符串
NE  noescape 不在输出转义特殊字符
PT  passthrough 传递给下一个处理
S=num  skip 跳过num条规则
E=VAR:VAL  env 设置环境变量
CO=NAME:VAL:domain[:lifetime[:path]]  cookie 设置cookie

redirect|R [=code] (强制重定向 redirect)

以 http://thishost[:thisport]/(使新的URL成为一个URI) 为前缀的Substitution可以强制性执行一个外部重定向。 如果code没有指定,则产生一个HTTP响应代码302(临时性移动)。 如果需要使用在300-400范围内的其他响应代码,只需在此指定这个数值即可, 另外,还可以使用下列符号名称之一: temp (默认的), permanent, seeother. 用它可以把规范化的URL反馈给客户端,如, 重写“/~”为 “/u/”,或对/u/user加上斜杠,等等。

注意: 在使用这个标记时,必须确保该替换字段是一个有效的URL! 否则,它会指向一个无效的位置! 并且要记住,此标记本身只是对URL加上 http://thishost[:thisport]/的前缀,重写操作仍然会继续。 通常,你会希望停止重写操作而立即重定向,则还需要使用’L’标记.

forbidden|F (强制URL为被禁止的 forbidden)

强制当前URL为被禁止的,即,立即反馈一个HTTP响应代码403(被禁止的)。 使用这个标记,可以链接若干RewriteConds以有条件地阻塞某些URL。

gone|G’(强制URL为已废弃的 gone)

强制当前URL为已废弃的,即,立即反馈一个HTTP响应代码410(已废弃的)。 使用这个标记,可以标明页面已经被废弃而不存在了.

proxy|P (强制为代理 proxy)

此标记使替换成分被内部地强制为代理请求,并立即(即, 重写规则处理立即中断)把处理移交给代理模块。 你必须确保此替换串是一个有效的(比如常见的以 http://hostname开头的)能够为Apache代理模块所处理的URI。 使用这个标记,可以把某些远程成分映射到本地服务器名称空间, 从而增强了ProxyPass指令的功能。

注意: 要使用这个功能,代理模块必须编译在Apache服务器中。 如果你不能确定,可以检查“httpd -l”的输出中是否有mod_proxy.c。 如果有,则mod_rewrite可以使用这个功能; 如果没有,则必须启用mod_proxy并重新编译“httpd”程序。

last|L (最后一个规则 last)

立即停止重写操作,并不再应用其他重写规则。 它对应于Perl中的last命令或C语言中的break命令。 这个标记可以阻止当前已被重写的URL为其后继的规则所重写。 举例,使用它可以重写根路径的URL(’/’)为实际存在的URL, 比如, ‘/e/www/’.

next|N (重新执行 next round)

chain|C (与下一个规则相链接 chained)

此标记使当前规则与下一个(其本身又可以与其后继规则相链接的, 并可以如此反复的)规则相链接。 它产生这样一个效果: 如果一个规则被匹配,通常会继续处理其后继规则, 即,这个标记不起作用;如果规则不能被匹配, 则其后继的链接的规则会被忽略。比如,在执行一个外部重定向时, 对一个目录级规则集,你可能需要删除“.www” (此处不应该出现“.www”的)。

type|T=MIME-type(强制MIME类型 type)

强制目标文件的MIME类型为MIME-type。 比如,它可以用于模拟mod_alias中的ScriptAlias指令, 以内部地强制被映射目录中的所有文件的MIME类型为“application/x-httpd-cgi”。

nosubreq|NS (仅用于不对内部子请求进行处理 no internal sub-request)

在当前请求是一个内部子请求时,此标记强制重写引擎跳过该重写规则。 比如,在mod_include试图搜索可能的目录默认文件(index.xxx)时, Apache会内部地产生子请求。对子请求,它不一定有用的,而且如果整个规则集都起作用, 它甚至可能会引发错误。所以,可以用这个标记来排除某些规则。

根据你的需要遵循以下原则: 如果你使用了有CGI脚本的URL前缀,以强制它们由CGI脚本处理, 而对子请求处理的出错率(或者开销)很高,在这种情况下,可以使用这个标记。

nocase|NC (忽略大小写 no case)

它使Pattern忽略大小写,即, 在Pattern与当前URL匹配时,’A-Z’ 和’a-z’没有区别。

qsappend|QSA (追加请求串 query string append)

此标记强制重写引擎在已有的替换串中追加一个请求串,而不是简单的替换。 如果需要通过重写规则在请求串中增加信息,就可以使用这个标记。

noescape|NE (在输出中不对URI作转义 no URI escaping)

此标记阻止mod_rewrite对重写结果应用常规的URI转义规则。 一般情况下,特殊字符(如’%’, ‘$’, ‘;’等)会被转义为等值的十六进制编码。 此标记可以阻止这样的转义,以允许百分号等符号出现在输出中,如:

RewriteRule /foo/(.*) /bar?arg=P1\=$1 [R,NE] 可以使’/foo/zed’转向到一个安全的请求’/bar?arg=P1=zed’.

passthrough|PT (移交给下一个处理器 pass through)

此标记强制重写引擎将内部结构request_rec中的uri字段设置为 filename字段的值,它只是一个小修改,使之能对来自其他URI到文件名翻译器的 Alias,ScriptAlias, Redirect 等指令的输出进行后续处理。举一个能说明其含义的例子: 如果要通过mod_rewrite的重写引擎重写/abc为/def, 然后通过mod_alias使/def转变为/ghi,可以这样:

RewriteRule ^/abc(.*) /def$1 [PT]Alias /def /ghi

如果省略了PT标记,虽然mod_rewrite运作正常, 即, 作为一个使用API的URI到文件名翻译器, 它可以重写uri=/abc/…为filename=/def/…, 但是,后续的mod_alias在试图作URI到文件名的翻译时,则会失效。

注意: 如果需要混合使用不同的包含URI到文件名翻译器的模块时, 就必须使用这个标记。。 混合使用mod_alias和mod_rewrite就是个典型的例子。

For Apache hackers

如果当前Apache API除了URI到文件名hook之外,还有一个文件名到文件名的hook, 就不需要这个标记了! 但是,如果没有这样一个hook,则此标记是唯一的解决方案。 Apache Group讨论过这个问题,并在Apache 2.0 版本中会增加这样一个hook。

skip|S=num (跳过后继的规则 skip)

此标记强制重写引擎跳过当前匹配规则后继的num个规则。 它可以实现一个伪if-then-else的构造: 最后一个规则是then从句,而被跳过的skip=N个规则是else从句. (它和’chain|C’标记是不同的!)

env|E=VAR:VAL (设置环境变量 environment variable)

此标记使环境变量VAR的值为VAL, VAL可以包含可扩展的反向引用的正则表达式$N和%N。 此标记可以多次使用以设置多个变量。 这些变量可以在其后许多情况下被间接引用,但通常是在XSSI (via ) or CGI (如 $ENV{’VAR’})中, 也可以在后继的RewriteCond指令的pattern中通过%{ENV:VAR}作引用。 使用它可以从URL中剥离并记住一些信息。

cookie|CO=NAME:VAL:domain[:lifetime[:path]] (设置cookie)

它在客户端浏览器上设置一个cookie。 cookie的名称是NAME,其值是VAL。 domain字段是该cookie的域,比如’.apache.org’, 可选的lifetime是cookie生命期的分钟数, 可选的path是cookie的路径。

●举例说明RewriteCond命令规则

RewriteRule指令格式

RewriteRule指令,可以定义一条重写规则,规则间的顺序非常重要。对Apache1.2及以后的版本,模板(Pattern)是一个POSIX正则式,用以匹配当前的URL。当前的URL不一定是最初提交的URL,因为可能用一些规则在此规则前已经对URL进行了处理。rewritePattern 大多数文章写为Substitution ,这里为了更清楚的认识故写为rewritePattern 。

●Pattern 可以使用如下特殊匹配規則,如php等其他語言類似。

rewritePattern 是针对Pattern 匹配后的URL进行rewritePattern 规定的替换。应用替换时,前面Pattern 第一个()中匹配的内容后面rewritePattern 就可以用$1引用,第二个()中匹配的就用$2应用……以此类推。

●在rewritePattern 之后追加特殊的标记[flags] 作为RewriteRule 指令的第三个参数。flags可以使用的标记,和上面RewriteCond使用的一样。

●举例说明RewriteRule语法

RewriteRule index.html index.php

比如:http://www.andelse.cn/index.html  -> http://www.andelse.cn/index.php

RewriteRule ^test([0-9]*).html$ test.php?id=$1

比如:http://www.andelse.cn/test8.html  -> http://www.andelse.cn/test.php?id=8

RewriteRule ^cat-([0-9]+)-([0-9]+)\.html$ cat.php?id1=$1&id2=$2

比如:http://www.andelse.cn/cat-1-3.html -> http://www.andelse.cn/cat.php?id1=1&id2=3

RewriteRule ^cat-([a-zA-Z0-9\-]*)-([0-9]+)-([0-9]+)\.html$ cat.php?id0=$1&id1=$2&id2=$3

比如:http://www.andelse.cn/cat-zbc2ac-3-5.html -> http://www.andelse.cn/cat.php?id0=zbc2ac&id1=3&id2=5

RewriteRule ^cat1-([0-9]+)-([0-9]+)-([0-9]+)\.html$ cat1.php?id1=$1&id2=$2&id3=$3

比如:http://www.andelse.cn/cat1-4-3-8.html -> http://www.andelse.cn/cat1.php?id1=4&id2=3&id3=8

RewriteRule ^cat([0-9]*)/$ cat.php?id1=$1

比如:http://www.andelse.cn/cat5/ -> http://www.andelse.cn/cat.php?id1=5

RewriteRule ^catm([0-9]*)/([0-9]*)/$ catm.php?id1=$1&id2=$2

比如:http://www.andelse.cn/catm6/3/ -> http://www.andelse.cn/catm.php?id1=6&id2=3

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/222516.html原文链接:https://javaforall.net

(0)
上一篇 2026年3月17日 下午3:37
下一篇 2026年3月17日 下午3:37


相关推荐

  • Fisher线性判别分析

    Fisher线性判别分析一 问题描述在 UCI 数据集上的 Iris 和 Sonar 数据上验证算法的有效性 Iris 数据 3 类 4 维 150 个数据 Sonar 数据 2 类 60 维 208 个样本 训练和测试样本有三种方式进行划分 三选一 1 将数据随机分训练和测试 多次平均求结果 2 K 折交叉验证 3 留 1 法针对不同维数 画出曲线图二 解决方法 1 F

    2026年2月23日
    1
  • sql日期时间转换成字符串_把时间格式转化为字符串格式

    sql日期时间转换成字符串_把时间格式转化为字符串格式一、sqlserver日期时间函数SqlServer中的日期与时间函数1.当前系统日期、时间selectgetdate()2.dateadd在向指定日期加上一段时间的基础上,返回新的datetime值例如:向日期加上2天selectdateadd(day,2,’2004-10-15′)–返回:2004-10-1700:00:00.0003.datediff返回跨两个指定日期的日期和时间边界数。sel…

    2022年10月8日
    6
  • OpenClaw 为什么这么费 Token?6 个原因分析与省钱攻略

    OpenClaw 为什么这么费 Token?6 个原因分析与省钱攻略

    2026年3月13日
    6
  • 电脑不停自动安装垃圾软件怎么办

    电脑不停自动安装垃圾软件怎么办在使用电脑的时候 相信大家都可能遇到过这种情况 那就是不小心安装了捆绑软件 或者中毒了原因等 导致电脑不停自动安装垃圾软件怎么办 那么这种情况该如何阻止电脑安装垃圾软件 下面小编就教下大家阻止电脑安装垃圾软件的方法 方法一 阻止软件安装 1 按快捷键 win R 打开运行窗口 在搜索框中输入 gpedit msc 再按回车键 2 本地组策略编辑器中打开管理模板选项 3 然后在管理模板选项里打开 windows 组件之后可以找到 windowsinsta 选项 4 接着在右侧的页面里

    2026年3月19日
    1
  • 马斯克推出“AI女友”,30刀/月!教你怎么用AI生成专属女友形象(附工具地址和教程)

    马斯克推出“AI女友”,30刀/月!教你怎么用AI生成专属女友形象(附工具地址和教程)

    2026年3月15日
    2
  • linux卸载wine qq,ubuntu安装wineQQ

    linux卸载wine qq,ubuntu安装wineQQUbuntu系发行版安装deepinwineQQ的步骤第1步,安装deepin-wine环境:上https://github.com/wszqkzqk/deepin-wine-ubuntu页面下载zip包(或用git方式克隆),解压到本地文件夹,在文件夹中打开终端,输入sudosh./install.sh一键安装。一些小问题的解决方法0,安装之后找不到在哪里启动:安装完deepin.com…

    2025年9月21日
    11

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号