前阵子某天,一同事让我帮忙看一下某内部服务器的域名跳转的配置,本来这两年好像没做Web服务器方面东西了,不过鉴于曾经在互联网行业工作过,还是略懂Apache配置,也想顺便玩一下。最后的配置还是比价简单的,也实现了他所需的功能。今天有点空闲时间,想写篇博客总结一些apache rewrite的配置语法和实例(源于网络资料),以便今后快速查阅。
我最后其实就在httpd.conf文件写了如下几行配置就将域名中以“otc-team”开头的URL重定向为“http://otcteam.mycompany.com/”下面的对应URL。
[Copy to clipboard]View Code BASHRewriteEngine on
RewriteCond %{HTTP_HOST} ^otc-team [NC]
RewriteRule ^(.*) http://otcteam.mycompany.com/$1[L] 1. 一些基础知识的介绍:
The mod_rewrite module uses a rule-based rewriting engine, based on a PCRE regular-expression parser, to rewrite requested URLs on the fly. By default, mod_rewrite maps a URL to a filesystem path. However, it can also be used to redirect one URL to another URL, or to invoke an internal proxy fetch.
mod_rewrite provides a flexible and powerful way to manipulate URLs using an unlimited number of rules. Each rule can have an unlimited number of attached rule conditions, to allow you to rewrite URL based on server variables, environment variables, HTTP headers, or time stamps.
mod_rewrite operates on the full URL path, including the path-info section. A rewrite rule can be invoked in httpd.conf or in .htaccess. The path generated by a rewrite rule can include a query string, or can lead to internal sub-processing, external request redirection, or internal proxy throughput.
简单解释一下内部重定向和外部重定向吧。内部重定向,是指域名并不发生变化,只是将某个URL映射到了文件系统中的另一个路径。外部重定向,是指URL已经法发生变化(在浏览器中显示看到的域名也跟着变化了),从一个URL映射到了另一个URL(可以是不同主机的,当然也可以是同一主机上的)。
PCRE(Perl Compatible Regular Expressions)是与Perl5.x兼容的正则表达式,使用这种正则表达式的著名软件项目有Apache、PHP、KDE、Safari等。 重写规则的作用范围,有如下三种:
1) 可以使用在Apache主配置文件httpd.conf中
2) 可以使用在httpd.conf里定义的虚拟主机配置中
3) 可以使用在基本目录的跨越配置文件.htaccess中
首先,apache在编译时将mod_rewrite编译为模块,然后在Apache的配置文件中加载它:
LoadModule rewrite_module modules/mod_rewrite.so
其次,这三种方式,都需要在写规则前,用“RewriteEngine on”指令来打开rewrite功能。
假如你对你的的网站内容所在的服务器没有管理员权限,或者你的网站放在ISP的服务器上托管等等条件下,你无法改写主配置文件,然而你可以对你的WEB站点内容所在的目录有写权限,则你可以设置自己的.htaccess文件。 (本博客站点就有设置.htaccess文件做rewrite。)对文件.htaccess所作的任何改动不需要重启动Apache. 不过,值得注意的是,需要确定主配置文件中对你的网站所在的目录定义了下面的内容:
Options Indexes FollowSymLinks
AllowOverride all
否则你的.htaccess文件配置不会工作。 2. Apache mod_rewrite规则重写的标志一览
1) R[=code](force redirect) 强制外部重定向
强制在替代字符串加上http://thishost[:thisport]/前缀重定向到外部的URL.如果code不指定,将用缺省的302 HTTP状态码。
2) F(force URL to be forbidden)禁用URL,返回403HTTP状态码。
3) G(force URL to be gone) 强制URL为GONE,返回410HTTP状态码。
4) P(force proxy) 强制使用代理转发。
5) L(last rule) 表明当前规则是最后一条规则,停止分析以后规则的重写。
6) N(next round) 重新从第一条规则开始运行重写过程。
7) C(chained with next rule) 与下一条规则关联
如果规则匹配则正常处理,该标志无效,如果不匹配,那么下面所有关联的规则都跳过。
8.) T=MIME-type(force MIME type) 强制MIME类型
9) NS (used only if no internal sub-request) 只用于不是内部子请求
10) NC(no case) 不区分大小写
11) QSA(query string append) 追加请求字符串
12) NE(no URI escaping of output) 不在输出转义特殊字符
例如:RewriteRule /foo/(.*) /bar?arg=P1%3d$1 [R,NE] #将能正确的将/foo/zoo转换成/bar?arg=P1=zoo
13) PT(pass through to next handler) 传递给下一个处理
例如:
RewriteRule ^/abc(.*) /def$1 [PT] # 将会交给/def规则处理
Alias /def /ghi
14) S=num(skip next rule(s)) 跳过num条规则
15) E=VAR:VAL(set environment variable) 设置环境变量
另外,P是代理模式转发,必须用url全称,并且要保证modProxy打开,也就是下面httpd.conf中的如下两个指令:
LoadModule proxy_module modules/mod_proxy.so
LoadModule proxy_http_module modules/mod_proxy_http.so
如果对应proxy模块没加载,则会出现403禁止页面。 3. 一些有用的实际rewrite例子
例1.下面是在一个虚拟主机里定义的规则。功能是把client请求的主机前缀不是www.smilejay.com和173.192.169.119都跳转到主机前缀为http://www.smilejay.com,避免相同内容的网页有多个指向的域名,如http://smilejay.com
[Copy to clipboard]View Code BASH1
2