Apache的Mod_rewrite学习 (RewriteCond重写规则的条件) 转

RewriteCondSyntax: RewriteCond TestString CondPattern [flags]  RewriteCond指令定义一条规则条件。在一条RewriteRule指令前面可能会有一条或多条RewriteCond指令,只有当自身的模板(pattern)匹配成功且这些条件也满足时规则才被应用于当前URL处理。  TestString是一个字符串,除了包含普通的字符外,还可以包括下列的可扩展结构:

1.       $N,RewriteRule后向引用,其中(0 <= N <= 9)  $N引用紧跟在RewriteCond后面的RewriteRule中模板中的括号中的模板在当前URL中匹配的数据。

2.       %N,RewriteCond后向引用,其中(0 <= N <= 9)  %N引用最后一个RewriteCond的模板中的括号中的模板在当前URL中匹配的数据。

3.       ${mapname:key|default},RewriteMap扩展.具体参见RewriteMap

4.       %{ NAME_OF_VARIABLE } ,服务器变量。变量的名字如下表(分类显示)

HTTP headers: connection & request: server internals: system stuff:
HTTP_USER_AGENT REMOTE_ADDR DOCUMENT_ROOT TIME_YEAR
HTTP_REFERER REMOTE_HOST SERVER_ADMIN TIME_MON
HTTP_COOKIE REMOTE_USER SERVER_NAME TIME_DAY
HTTP_FORWARDED REMOTE_IDENT SERVER_ADDR TIME_HOUR
HTTP_HOST REQUEST_METHOD SERVER_PORT TIME_MIN
HTTP_PROXY_CONNECTION SCRIPT_FILENAME SERVER_PROTOCOL TIME_SEC
HTTP_ACCEPT PATH_INFO SERVER_SOFTWARE TIME_WDAY

 
QUERY_STRING
 
TIME

 
AUTH_TYPE
 

 

5.

specials: 说明
API_VERSION Apache与模块间的接口的版本号
THE_REQUEST 客户端发送到来的HTTP请求行的整行信息,不含其它的头字段信息,如("GET /index.html HTTP/1.1")
REQUEST_URI HTTP请求行中请求的资源
REQUEST_FILENAME 请求中对应的服务器本地文件系统中全路径文件名
IS_SUBREQ 根据是否为SubRequest,分别值为”true”或”false”

6.       特别说明:

o        SCRIPT_FILENAME和REQUEST_FILENAME变量含有相同的值,也就是Apache服务器内部数据结构request_rec的filename字段的值。第一个变量是一个CGI变量,而第二个则与REQUEST_URI(含有request_rec数据结构中uri字段的值)保持一致。

o        %{ENV:variable}中的variable可以是任何环境变量的名字。对其值的查找,先通过Apache内部的数据结构,(如找不到)再在Apache服务器进程中通过getenv()查找。

o        %{HTTP:header}中的header可以是任何HTTP MIME-header的名字,其值通过查找HTTP请求信息而得。

o        %{LA-U:variable} 用来引用后续API阶段中定义的、当前还不知道的值,具体实现是通过执行一个基于URL的内部的sub-request来决定的variable的最终的值。例如,假如你想在服务器范围内利用REMOTE_USER的值来完成重写,但这个值是在验证阶段设置的,而验证阶段是在URL转换阶段的后面。从另一方面讲,由于mod_rewrite在修补(fixup)API阶段进行目录范围的重写,而修补阶段在验证阶段的后面,所以此时只要用%{REMOTE_USER}就可以取得该值了。

o        %{LA-F:variable},执行一个基于文件名字(filename)的内部sub-request来决定variable的最终的值。大多数时间内,这和LA-U相同。

  CondPattern是一个条件模板,也就是说,是一个扩展正则式(extended regular expression),用与跟TestString进行匹配。作为一个标准的扩展正则式,CondPattern有以下补充:

1.       可以在模板串前增加一个!前缀,以用表示不匹配模板。但并不是所有的test都可以加!前缀。

2.       CondPattern中可以使用以下特殊变量:

o        ‘<CONDPATTERN‘ (小于,基于字母顺序)将condPattern当作一个普通字符串,将它和TestString进行比较,当TestString 的字符小于CondPattern为真.

o        ‘>CondPattern‘ (大于)将condPattern当作一个普通字符串,将它和TestString进行比较,当TestString 的字符大于CondPattern为真.

o        ‘=CondPattern‘ (等于)将condPattern当作一个普通字符串,将它和TestString进行比较,当TestString 与CondPattern完全相同时为真.如果CondPattern只是 "" (两个引号紧挨在一起) 此时需TestString 为空字符串方为真.

o        ‘-d‘ (是否为目录)将testString当作一个目录名,检查它是否存在以及是否是一个目录.

o        ‘-f‘ (是否是regular file)将testString当作一个文件名,检查它是否存在以及是否是一个regular文件.

o        ‘-s‘ (是否为长度不为0的regular文件)将testString当作一个文件名,检查它是否存在以及是否是一个长度大于0的regular文件

o        ‘-l‘ (是否为symbolic link)将testString当作一个文件名,检查它是否存在以及是否是一个 symbolic link.

o        ‘-F‘ (通过subrequest来检查某文件是否可访问)检查TestString是否是一个合法的文件,而且通过服务器范围内的当前设置的访问控制进行访问。这个检查是通过一个内部subrequest完成的, 因此需要小心使用这个功能以降低服务器的性能。

o        ‘-U‘ (通过subrequest来检查某个URL是否存在)检查TestString是否是一个合法的URL,而且通过服务器范围内的当前设置的访问控制进行访问。这个检查是通过一个内部subrequest完成的, 因此需要小心使用这个功能以降低服务器的性能。

  [flags]是第三个参数,多个标志之间用逗号分隔。

1.       ‘nocase|NC‘ (不区分大小写)  在扩展后的TestString和CondPattern中,比较时不区分文本的大小写。注意,这个标志对文件系统和subrequest检查没有影响.

2.       ‘ornext|OR‘ (建立与下一个条件的或的关系)  默认的情况下,二个条件之间是AND的关系,用这个标志将关系改为OR。例如: RewriteCond %{REMOTE_HOST} ^host1.* [OR]RewriteCond %{REMOTE_HOST} ^host2.* [OR]RewriteCond %{REMOTE_HOST} ^host3.*RewriteRule ...如果没有[OR]标志,需要写三个条件/规则.

例子:根据客户端浏览器的不同,返回不同的首页面。RewriteCond %{HTTP_USER_AGENT} ^Mozilla.*RewriteRule ^/$ /homepage.max.html [L]RewriteCond %{HTTP_USER_AGENT} ^Lynx.*RewriteRule ^/$ /homepage.min.html [L]RewriteRule ^/$ /homepage.std.html [L]

当你在地址栏里输入 sina.com.cn  google.cn

看看有什么变化?是不是会自动跳转到 www.sina.com.cn   www.google.cn

这一技术通过apache的rewrite可以实现,当然你得把 不带www的域名指向你服务器的IP

要是虚拟主机的话,得在viralhost段加入 ServerAlias xxx.com

然后打开重写引擎功能

RewriteEngine On

能过rewritecond判断主机名是否带www

RewriteCond %{HTTP_HOST}  ^xxx/.com$ [NC]

然后来一条

RewriteRule ^/(.*)$  http://www.xxx.com/$1 [R=301,L]

OK,重起apache,现在在浏览器中输入 xxx.com 看看是不是自动变成了www.xxx.com了呢。

重新整理一下就是:

RewriteEngine On

RewriteCond %{HTTP_HOST} ^xxx/.com$ [NC]

RewriteRule ^/(.*)$  http://www.xxx.com/$1 [R=301,L]

用.htaccess文件的话:

RewriteEngine on
RewriteCond %{HTTP_HOST}  ^mydomain.com [NC]
RewriteRule ^(.*)$ http://www.mydomain.com/$1 [L,R=301]

时间: 2024-10-02 21:40:42

Apache的Mod_rewrite学习 (RewriteCond重写规则的条件) 转的相关文章

Apache的Mod_rewrite学习(RewriteRule重写规则的语法) 转

RewriteRuleSyntax: RewriteRule Pattern Substitution [flags] 一条RewriteRule指令,定义一条重写规则,规则间的顺序非常重要.对Apache1.2及以后的版本,模板(pattern)是一个 POSIX正则式,用以匹配当前的URL.当前的URL不一定是用记最初提交的URL,因为可能用一些规则在此规则前已经对URL进行了处理.对mod_rewrite来说,!是个合法的模板前缀,表示"非"的意思,这对描述"不满足某种

python学习笔记七:条件&循环语句

1.print/import更多信息 print打印多个表达式,使用逗号隔开 >>> print 'Age:',42 Age: 42   #注意个结果之间有一个空格符 import:从模块导入函数 import 模块 from 模块 import 函数 from 模块 import * 如果两个模块都有open函数的时候, 1)使用下面方法使用: module1.open()... module2.open()... 2)语句末尾增加as子句 >>> import ma

Ubuntu系统下允许Apache的mod_rewrite功能

首先,使能apache的rewirte模块,在shell里输入下边的命令: sudo a2enmod rewrite 然后重启一下webserver使更改生效 sudo service apache2 restart 通常利用Apache的rewrite模块对 URL 进行重写的时候, rewrite规则会写在 .htaccess 文件里.但要使 apache 能够正常的读取.htaccess 文件的内容,就必须对.htaccess 所在目录进行配置.从安全性考虑,根目录的AllowOverri

python基础教程_学习笔记7:条件、循环、其它语句

条件.循环.其它语句 print和import 随着更加深入地学习python,可能会出现这种感觉:有些自以为已经掌握的知识点,还隐藏着一些让人惊讶的特性. 使用逗号输出 打印多个表达式,只要将这些表达式用逗号隔开即可: >>> print "age:",28 age: 28 参数之间都插入了一个空格符. 如果在结尾加上逗号,那么接下来的语句会与前一条语句在同一行打印: print "Hello,", print "World!"

python学习[第十三篇] 条件和循环

python学习[第十三篇] 条件和循环 if语句 单一if 语句 if语句有三个部分构成,关键字if本身,判断结果真假的条件表达式,以及表达式为真或非0是执行的代码 if expression: expr_true_suite 条件表达式可以是多重的 通过布尔操作符 and or not来实现 单一语句的if 代码块,如果if语句的执行代码只有一行,可以放在一行来写 if expresssion: expr_tru_suite >>> if True: print True ... T

Apache 关于 mod_rewrite 遇到 %2F或%5C (正反斜杠)等特殊符号导致URL重写失效出现404的问题

.htaccess 文件 <IfModule mod_rewrite.c> RewriteEngine on RewriteCond %{REQUEST_FILENAME} !-d RewriteCond %{REQUEST_FILENAME} !-f RewriteRule ^(.*)$ index.php/$1 [QSA,PT,L] </IfModule> http://localhost/Application/Home/Index/index/url/http%3A%2F%

【转】Apache 关于 mod_rewrite 遇到 %2F或%5C (正反斜杠)等特殊符号导致URL重写失效出现404的问题

.htaccess 文件 [plain] view plaincopy <IfModule mod_rewrite.c> RewriteEngine on RewriteCond %{REQUEST_FILENAME} !-d RewriteCond %{REQUEST_FILENAME} !-f RewriteRule ^(.*)$ index.php/$1 [QSA,PT,L] </IfModule> http://localhost/Application/Home/Inde

windows开启Apache的mod_rewrite模块

windows下安装apache默认是没有开启mod_rewrite模块的,启用也很简单,修改apache配置文件httpd.conf,查找rewrite_module, 找到这行:#LoadModule rewrite_module modules/mod_rewrite.so这一行前面的#号去掉,改为LoadModule rewrite_module modules/mod_rewrite.so

Apache Shiro Realm 学习记录1

最近几天在学习Apache Shiro......看了一些大神们的教程.....感觉收获不少.....但是毕竟教程也只是指引一下方向....即使是精辟教程,仍然有很多东西都没有说明....所以自己也稍微研究了一下...记录了一下我的研究发现....教程点这里 这篇教程的最后提到了自己去写Realm.....然后给出了4个方法.....但是并没有怎么详细说明.....我想说说我的理解.....(我的理解可能会有很多错误) 我想先说说登陆验证的大致流程....大致...... 从用户那里收集完用户名