Apache Rewrite

Rewirte主要的功能就是实现URL的跳转,它的正则表达式是基于Perl语言。可基于服务器级的(httpd.conf)和目录级的 (.htaccess)两种方式。如果要想用到rewrite模块,必须先安装或加载rewrite模块。方法有两种一种是编译apache的时候就直接 安装rewrite模块,别一种是编译apache时以DSO模式安装apache,然后再利用源码和apxs来安装rewrite模块。

基于服务器级的(httpd.conf)有两种方法,一种是在httpd.conf的全局下 直接利用RewriteEngine on来打开rewrite功能;另一种是在局部里利用RewriteEngine on来打开rewrite功能,下面将会举例说明,需要注意的是,必须在每个virtualhost里用RewriteEngine on来打开rewrite功能。否则virtualhost里没有RewriteEngine on它里面的规则也不会生效。

基于目录级的(.htaccess),要注意一点那就是必须打开此目录的FollowSymLinks属性且在.htaccess里要声明RewriteEngine on。

RewriteCond重写规则的条件

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]

转载:http://blog.csdn.net/keyunq/article/details/2536875

时间: 2024-11-07 02:08:07

Apache Rewrite的相关文章

Apache Rewrite 拟静态

mod_rewrite是Apache的一个非常强大的功能,它可以实现伪静态页面.一些防盗链就是通过该方法做到的. 00x1 启动rewrite引擎 RewriteEndine on 可以使用两种方式来写rewite,一种是直接在httpd.conf当中写.一种则是写在.htaccess中. 00x2 如何启用apache rewrite? 在httpd.conf当中找到“LoadModule rewrite_module modules/mod_rewrite.so”将#号去除即开启了apach

apache rewrite规则

在开篇之前:我想说这篇文章其实是我刚刚接触Rewrite的时候学习的文档,应属转载,但是在这里我不想写明原地址,原因是文章中大多数给出的配置命令经实验都是错误的.需要原文的可以在谷歌上搜索一下"Apache Rewrite 规则详解"好在我对正则表达式有所了解,把原文的代码都通过自己的理解改写了一下,并都能够达到题设的要求,并联想需求添加了例子.本文是经过我实验后修改有效的,如果还是出现500错误请去掉 # 及后面的注释(也许有些环境不支持中文注解),如果还是错误请在下面给我留言. 1

Apache Rewrite 规则详解

转自:http://www.cnblogs.com/top5/archive/2009/08/12/1544098.html 1.Rewrite规则简介: Rewirte主要的功能就是实现URL的跳转,它的正则表达式是基于Perl语言.可基于服务器级的(httpd.conf)和目录级的 (.htaccess)两种方式.如果要想用到rewrite模块,必须先安装或加载rewrite模块.方法有两种一种是编译apache的时候就直接 安装rewrite模块,别一种是编译apache时以DSO模式安装

Ubuntu14.14开启Apache Rewrite功能的方法详解

Ubuntu上开启Apache Rewrite功能的方法发布时间:2012-09-11编辑:脚本学堂本文介绍ubuntn系统中开启apache的urlrewrite功能的方法. 在Windows上开启Apache的urlRewrite非常简单,因为apache的用户配置都是放在http.conf文件中,要开启Rewrite功能,只需要把该文件中LoadModule rewrite_module modules/mod_rewrite.so前面的注视去掉,然后重启APACHE即可. 但在Ubunt

Apache Rewrite url重定向功能的简单配置

Rewrite url重定向就是实现URL的跳转和隐藏真实地址,基于Perl语言的正则表达式规范.平时帮助我们实现拟静态,拟目录,域名跳转,防止盗链等 1.Apache Rewrite的主要功能 就是实现URL的跳转和隐藏真实地址,基于Perl语言的正则表达式规范.平时帮助我们实现拟静态,拟目录,域名跳转,防止盗链等 2.Apache Rewrite的配置 Apache下的Rewrite配置主要有两种,一种是针对整个apache服务器的配置,此种配置的Rewrite规则是直接在httpd.con

apache rewrite规则白名单示例

如何在apache中使用rewrite规则配置白名单,这里分享一个方法. 今天弄了半天apache 的rewrite 规则,还是没有配置出符合的规则.经同事指点,成功. 需求:六个文件的入口,其他都重定向到index自己的思路:正则找出不是六个文件的URL的模式,进行过滤.对比同事的结果,自己思路的问题:1. 想找出所有不符合规则的,越想越多,无法下手.---------------- 思路错误,应该 制定白名单,2. 概念错误, 弄错 REQUEST_URI 和 REQUEST_STRING

Apache Rewrite的主要功能

#Apache Rewrite的主要功能 #就是实现URL的跳转和隐藏真实地址,基于Perl语言的正则表达式规范.#平时帮助我们实现拟静态,拟目录,域名跳转,防止盗链等 在httpd.conf中去掉下面这句前面的#LoadModule rewrite_module modules/mod_rewrite.so 下面再继续写

centos 开启apache rewrite模式

mod_rewrite能使网页伪静态,对于搜索引擎友好,下面就是开启这个功能的说明!启用mod_rewrite模块在conf目录的httpd.conf文件中找到 LoadModule rewrite_module modules/mod_rewrite.so 将这一行前面的#去掉.2.在要支持url rewirte的目录启用 Options FollowSymLinks和AllowOverride All Options Indexes FollowSymLinks AllowOverride

Apache Rewrite实现URL的跳转和域名跳转

Apache Rewrite实现URL的跳转和域名跳转 Rewirte主要的功能就是实现URL的跳转,它的正则表达式是基于Perl语言.可基 于服务器级的(httpd.conf)和目录级的 (.htaccess)两种方式.如果要想用到rewrite模块,必须先安装或加载rewrite模块.方法有两种一种是编译apache的时候就直接 安装rewrite模块,别一种是编译apache时以DSO模式安装apache,然后再利用源码和apxs来安装rewrite模块. 基于服务器级的(httpd.co

WordPress 中文URL不支持 Apache Rewrite 不支持中文 Ipage不支持中文

WordPress 站,在国内空间上好好的,只是限制容量... 于是平移到国外Ipage空间上去,但是发现个致命的问题:不支持中文URL!!! http://my.oschina.net/cart/ <!DOCTYPE HTML PUBLIC "-//IETF//DTD HTML 2.0//EN"> <html><head> <title>400 Bad Request - http://my.oschina.net/cart/</