Apache的Mod_rewrite学习 (RewriteCond重写规则的条件) 转
2014-10-15 11:02
771 查看
[align=left]RewriteCondSyntax: RewriteCond TestString CondPattern [flags] RewriteCond指令定义一条规则条件。在一条RewriteRule指令前面可能会有一条或多条RewriteCond指令,只有当自身的模板(pattern)匹配成功且这些条件也满足时规则才被应用于当前URL处理。 TestString是一个字符串,除了包含普通的字符外,还可以包括下列的可扩展结构:[/align]
[align=left]1. $N,RewriteRule后向引用,其中(0 <= N <= 9) $N引用紧跟在RewriteCond后面的RewriteRule中模板中的括号中的模板在当前URL中匹配的数据。[/align]
[align=left]2. %N,RewriteCond后向引用,其中(0 <= N <= 9) %N引用最后一个RewriteCond的模板中的括号中的模板在当前URL中匹配的数据。[/align]
[align=left]3. ${mapname:key|default},RewriteMap扩展.具体参见RewriteMap [/align]
[align=left]4. %{ NAME_OF_VARIABLE } ,服务器变量。变量的名字如下表(分类显示)[/align]
[align=left]5. [/align]
[align=left]6. 特别说明:[/align]
[align=left]o SCRIPT_FILENAME和REQUEST_FILENAME变量含有相同的值,也就是Apache服务器内部数据结构request_rec的filename字段的值。第一个变量是一个CGI变量,而第二个则与REQUEST_URI(含有request_rec数据结构中uri字段的值)保持一致。[/align]
[align=left]o %{ENV:variable}中的variable可以是任何环境变量的名字。对其值的查找,先通过Apache内部的数据结构,(如找不到)再在Apache服务器进程中通过getenv()查找。[/align]
[align=left]o %{HTTP:header}中的header可以是任何HTTP MIME-header的名字,其值通过查找HTTP请求信息而得。[/align]
[align=left]o %{LA-U:variable} 用来引用后续API阶段中定义的、当前还不知道的值,具体实现是通过执行一个基于URL的内部的sub-request来决定的variable的最终的值。例如,假如你想在服务器范围内利用REMOTE_USER的值来完成重写,但这个值是在验证阶段设置的,而验证阶段是在URL转换阶段的后面。从另一方面讲,由于mod_rewrite在修补(fixup)API阶段进行目录范围的重写,而修补阶段在验证阶段的后面,所以此时只要用%{REMOTE_USER}就可以取得该值了。[/align]
[align=left]o %{LA-F:variable},执行一个基于文件名字(filename)的内部sub-request来决定variable的最终的值。大多数时间内,这和LA-U相同。[/align]
[align=left] [/align]
[align=left] CondPattern是一个条件模板,也就是说,是一个扩展正则式(extended regular expression),用与跟TestString进行匹配。作为一个标准的扩展正则式,CondPattern有以下补充:[/align]
[align=left]1. 可以在模板串前增加一个!前缀,以用表示不匹配模板。但并不是所有的test都可以加!前缀。[/align]
[align=left]2. CondPattern中可以使用以下特殊变量:[/align]
[align=left]o '<CONDPATTERN' (小于,基于字母顺序)将condPattern当作一个普通字符串,将它和TestString进行比较,当TestString 的字符小于CondPattern为真. [/align]
[align=left]o '>CondPattern' (大于)将condPattern当作一个普通字符串,将它和TestString进行比较,当TestString 的字符大于CondPattern为真. [/align]
[align=left]o '=CondPattern' (等于)将condPattern当作一个普通字符串,将它和TestString进行比较,当TestString 与CondPattern完全相同时为真.如果CondPattern只是 "" (两个引号紧挨在一起) 此时需TestString 为空字符串方为真. [/align]
[align=left]o '-d' (是否为目录)将testString当作一个目录名,检查它是否存在以及是否是一个目录. [/align]
[align=left]o '-f' (是否是regular file)将testString当作一个文件名,检查它是否存在以及是否是一个regular文件. [/align]
[align=left]o '-s' (是否为长度不为0的regular文件)将testString当作一个文件名,检查它是否存在以及是否是一个长度大于0的regular文件[/align]
[align=left]o '-l' (是否为symbolic link)将testString当作一个文件名,检查它是否存在以及是否是一个 symbolic link. [/align]
[align=left]o '-F' (通过subrequest来检查某文件是否可访问)检查TestString是否是一个合法的文件,而且通过服务器范围内的当前设置的访问控制进行访问。这个检查是通过一个内部subrequest完成的, 因此需要小心使用这个功能以降低服务器的性能。[/align]
[align=left]o '-U' (通过subrequest来检查某个URL是否存在)检查TestString是否是一个合法的URL,而且通过服务器范围内的当前设置的访问控制进行访问。这个检查是通过一个内部subrequest完成的, 因此需要小心使用这个功能以降低服务器的性能。[/align]
[align=left] [flags]是第三个参数,多个标志之间用逗号分隔。[/align]
[align=left]1. 'nocase|NC' (不区分大小写) 在扩展后的TestString和CondPattern中,比较时不区分文本的大小写。注意,这个标志对文件系统和subrequest检查没有影响. [/align]
[align=left]2. 'ornext|OR' (建立与下一个条件的或的关系) 默认的情况下,二个条件之间是AND的关系,用这个标志将关系改为OR。例如: RewriteCond %{REMOTE_HOST} ^host1.* [OR]RewriteCond %{REMOTE_HOST} ^host2.* [OR]RewriteCond %{REMOTE_HOST} ^host3.*RewriteRule ...如果没有[OR]标志,需要写三个条件/规则.[/align]
例子:根据客户端浏览器的不同,返回不同的首页面。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]
[align=left]1. $N,RewriteRule后向引用,其中(0 <= N <= 9) $N引用紧跟在RewriteCond后面的RewriteRule中模板中的括号中的模板在当前URL中匹配的数据。[/align]
[align=left]2. %N,RewriteCond后向引用,其中(0 <= N <= 9) %N引用最后一个RewriteCond的模板中的括号中的模板在当前URL中匹配的数据。[/align]
[align=left]3. ${mapname:key|default},RewriteMap扩展.具体参见RewriteMap [/align]
[align=left]4. %{ NAME_OF_VARIABLE } ,服务器变量。变量的名字如下表(分类显示)[/align]
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 |
[align=left] [/align] | QUERY_STRING | [align=left] [/align] | TIME |
[align=left] [/align] | AUTH_TYPE | [align=left] [/align] | [align=left] [/align] |
specials: | 说明 |
API_VERSION | Apache与模块间的接口的版本号 |
THE_REQUEST | 客户端发送到来的HTTP请求行的整行信息,不含其它的头字段信息,如("GET /index.html HTTP/1.1") |
REQUEST_URI | HTTP请求行中请求的资源 |
REQUEST_FILENAME | 请求中对应的服务器本地文件系统中全路径文件名 |
IS_SUBREQ | 根据是否为SubRequest,分别值为”true”或”false” |
[align=left]o SCRIPT_FILENAME和REQUEST_FILENAME变量含有相同的值,也就是Apache服务器内部数据结构request_rec的filename字段的值。第一个变量是一个CGI变量,而第二个则与REQUEST_URI(含有request_rec数据结构中uri字段的值)保持一致。[/align]
[align=left]o %{ENV:variable}中的variable可以是任何环境变量的名字。对其值的查找,先通过Apache内部的数据结构,(如找不到)再在Apache服务器进程中通过getenv()查找。[/align]
[align=left]o %{HTTP:header}中的header可以是任何HTTP MIME-header的名字,其值通过查找HTTP请求信息而得。[/align]
[align=left]o %{LA-U:variable} 用来引用后续API阶段中定义的、当前还不知道的值,具体实现是通过执行一个基于URL的内部的sub-request来决定的variable的最终的值。例如,假如你想在服务器范围内利用REMOTE_USER的值来完成重写,但这个值是在验证阶段设置的,而验证阶段是在URL转换阶段的后面。从另一方面讲,由于mod_rewrite在修补(fixup)API阶段进行目录范围的重写,而修补阶段在验证阶段的后面,所以此时只要用%{REMOTE_USER}就可以取得该值了。[/align]
[align=left]o %{LA-F:variable},执行一个基于文件名字(filename)的内部sub-request来决定variable的最终的值。大多数时间内,这和LA-U相同。[/align]
[align=left] [/align]
[align=left] CondPattern是一个条件模板,也就是说,是一个扩展正则式(extended regular expression),用与跟TestString进行匹配。作为一个标准的扩展正则式,CondPattern有以下补充:[/align]
[align=left]1. 可以在模板串前增加一个!前缀,以用表示不匹配模板。但并不是所有的test都可以加!前缀。[/align]
[align=left]2. CondPattern中可以使用以下特殊变量:[/align]
[align=left]o '<CONDPATTERN' (小于,基于字母顺序)将condPattern当作一个普通字符串,将它和TestString进行比较,当TestString 的字符小于CondPattern为真. [/align]
[align=left]o '>CondPattern' (大于)将condPattern当作一个普通字符串,将它和TestString进行比较,当TestString 的字符大于CondPattern为真. [/align]
[align=left]o '=CondPattern' (等于)将condPattern当作一个普通字符串,将它和TestString进行比较,当TestString 与CondPattern完全相同时为真.如果CondPattern只是 "" (两个引号紧挨在一起) 此时需TestString 为空字符串方为真. [/align]
[align=left]o '-d' (是否为目录)将testString当作一个目录名,检查它是否存在以及是否是一个目录. [/align]
[align=left]o '-f' (是否是regular file)将testString当作一个文件名,检查它是否存在以及是否是一个regular文件. [/align]
[align=left]o '-s' (是否为长度不为0的regular文件)将testString当作一个文件名,检查它是否存在以及是否是一个长度大于0的regular文件[/align]
[align=left]o '-l' (是否为symbolic link)将testString当作一个文件名,检查它是否存在以及是否是一个 symbolic link. [/align]
[align=left]o '-F' (通过subrequest来检查某文件是否可访问)检查TestString是否是一个合法的文件,而且通过服务器范围内的当前设置的访问控制进行访问。这个检查是通过一个内部subrequest完成的, 因此需要小心使用这个功能以降低服务器的性能。[/align]
[align=left]o '-U' (通过subrequest来检查某个URL是否存在)检查TestString是否是一个合法的URL,而且通过服务器范围内的当前设置的访问控制进行访问。这个检查是通过一个内部subrequest完成的, 因此需要小心使用这个功能以降低服务器的性能。[/align]
[align=left] [flags]是第三个参数,多个标志之间用逗号分隔。[/align]
[align=left]1. 'nocase|NC' (不区分大小写) 在扩展后的TestString和CondPattern中,比较时不区分文本的大小写。注意,这个标志对文件系统和subrequest检查没有影响. [/align]
[align=left]2. 'ornext|OR' (建立与下一个条件的或的关系) 默认的情况下,二个条件之间是AND的关系,用这个标志将关系改为OR。例如: RewriteCond %{REMOTE_HOST} ^host1.* [OR]RewriteCond %{REMOTE_HOST} ^host2.* [OR]RewriteCond %{REMOTE_HOST} ^host3.*RewriteRule ...如果没有[OR]标志,需要写三个条件/规则.[/align]
例子:根据客户端浏览器的不同,返回不同的首页面。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]
相关文章推荐
- Apache的Mod_rewrite学习 (RewriteCond重写规则的条件)
- Apache - 模块 - mod_rewrite - RewriteCond - 以域名为重写条件
- Apache的Mod_rewrite学习(RewriteRule重写规则的语法)
- Apache的Mod_rewrite学习(RewriteRule重写规则的语法)
- Apache的Mod_rewrite学习(RewriteRule重写规则的语法)
- Apache mod_rewrite规则重写的标志一览
- RewriteRule重写规则的语法:Apache的Mod_rewrite
- Apache mod_rewrite规则重写的标志一览
- Apache mod_rewrite规则重写的标志一览
- 利用apache的mod_rewrite做URL规则重写
- RewriteRule重写规则的语法:Apache的Mod_rewrite
- 学习 Apache mod_rewrite 13 例
- Apache - 模块 - mod_rewrite - RewriteCond - 通过检查HTTP_REFERER避免静态图片盗链对性能有严重影响
- php 伪静态 (url rewrite mod_rewrite 重写) 本地APACHE支持urlrewrite 本地APACHE支持.htaccess 【转】
- Apache的Mod_rewrite学习
- Apache 重写规则的常见应用 (rewrite)
- php 伪静态 (url rewrite mod_rewrite 重写) 本地APACHE支持urlrewrite 本地APACHE支持.htaccess
- Apache 重写规则的常见应用 (rewrite)
- Apache的Mod_rewrite学习(RewriteCond & RewriteRule)
- 学习 Apache mod_rewrite 13 例