how to make pseudo-static html using apache

Rewirte主要的功能就是实现URL的跳转,Rewirte代码的正则表达式是基于Perl语言。基于服务器级的(httpd.conf)和目录级的 (.htaccess)两种方式,而我们Apache一般用的是目录级的 (.htaccess)方式,所以这里学习和记录的也就是(.htaccess)方式,俗称伪静态。

既然Rewirte主要的功能就是实现URL的跳转,所以直接从URL跳转入手。

一般的.htaccess伪静态跳转写法为(下例为输入a.bbb.cn的域名时跳转到www.bbb.cn):

RewriteEngineon

RewriteCond%{HTTP_HOST}^a.bbb.cn[NC]

RewriteRule^(.*)http://www.bbb.cn/[L]

ApacheRewrite规则重写的标志

1)R[=code](forceredirect)强制外部重定向

强制在替代字符串加上http://thishost[:thisport]/前缀重定向到外部的URL.如果code不指定,将用缺省的302HTTP状态码。

2)F(forceURLtobeforbidden)禁用URL,返回403HTTP状态码。

3)G(forceURLtobegone)强制URL为GONE,返回410HTTP状态码。

4)P(forceproxy)强制使用代理转发。

5)L(lastrule)表明当前规则是最后一条规则,停止分析以后规则的重写。

6)N(nextround)重新从第一条规则开始运行重写过程。

7)C(chainedwithnextrule)与下一条规则关联

如果规则匹配则正常处理,该标志无效,如果不匹配,那么下面所有关联的规则都跳过。

8)T=MIME-type(forceMIMEtype)强制MIME类型

9)NS(usedonlyifnointernalsub-request)只用于不是内部子请求

10)NC(nocase)不区分大小写

11)QSA(querystringappend)追加请求字符串

12)NE(noURIescapingofoutput)不在输出转义特殊字符

例如:RewriteRule/foo/(.*)/bar?arg=P1%3d$1[R,NE]将能正确的将/foo/zoo转换成/bar?arg=P1=zoo

13)PT(passthroughtonexthandler)传递给下一个处理

例如:

RewriteRule^/abc(.*)/def$1[PT]#将会交给/def规则处理

Alias/def/ghi

14)S=num(skipnextrule(s))跳过num条规则

15)E=VAR:VAL(setenvironmentvariable)设置环境变量

以下直接举例说明:

例一、在一个虚拟主机里定义的Rewrite规则。功能是把client请求的URL地址前缀不是www.aaa.cn和70.40.213.183都跳转到主机前缀为http://www.aaa.cn。这样就避免相同内容的网页有多个指向的域名,如http://aaa.cn,而不利于SEO。

RewriteEngineon#打开rewirte功能

RewriteCond%{HTTP_HOST}!^www.aaa.cn[NC]#声明Client请求的URL地址中前缀不是www.kiya.cn,其中[NC]的意思是忽略大小写

RewriteCond%{HTTP_HOST}!^70.40.213.183[NC]#声明Client请求的URL地址中前缀不是70.40.213.183

RewriteCond%{HTTP_HOST}!^$#声明Client请求的主机中前缀不为空

RewriteRule^(.*)http://www.aaa.cn/[L]#含义是如果Client请求的主机中的前缀符合上述条件,则直接进行跳转到http://aaacn/,[L]意味着立即停止重写操作,并不再应用其他重写规则。这里的.*是指匹配所有URL中不包含换行字符,()括号的功能是把所有的字符做一个标记,以便于后面的应用.就是引用前面里的(.*)字符。

例二、启用新域名为www.bbb.cn之后。需要将原来的域名ss.aaa.cn,以及论坛所在地址ss.aaa.cn/bbs/定向到新的域名,以便用户可以找到,并且使原来的论坛URL继续有效而不出现404未找到。比如原来的http://ss.aaa.cn/bbs/tread-60.html,让它在新的域名下继续有效,点击后转发到http://bbs.bbb.cn/tread-60.html;而其他网页,如原先的http://ss.aaa.cn/purchase不会跳转到二级域名bbs.bbb.cn/purchase上,而是到www.bbb.cn/purchase。

RewriteEngineOn

RewriteCond%{REQUEST_URI}^/bbs/

RewriteRule^bbs/(.*)http://bbs.aaa.cn/$1[R=permanent,L]

RewriteCond%{REQUEST_URI}!^/bbs/

RewriteRule^(.*)http://www.bbb.cn/$1[R=permanent,L]

例三、同时达到下面两个要求:

1.用http://www.zzz.com/xxx.php来访问http://www.zzz.com/xxx/

2.用http://yyy.zzz.com来访问http://www.zzz.com/user.php?username=yyy的功能

RewriteEngineOn

RewriteCond%{HTTP_HOST}^www.zzz.com

RewriteCond%{REQUEST_URI}!^user.php$

RewriteCond%{REQUEST_URI}.php$

RewriteRule(.*).php$http://www.zzz.com/$1/[R]

RewriteCond%{HTTP_HOST}!^www.zzz.com

RewriteRule^(.+)%{HTTP_HOST}[C]

RewriteRule^([^.]+).zzz.comhttp://www.zzz.com/user.php?username=$1

例四、将URL地址/type.php?typeid=*跳转至/type*.html,URL地址/type.php?typeid=*&page=*跳转至/type*page*.html

RewriteRule^/type([0-9]+).html$/type.php?typeid=$1[PT]

RewriteRule^/type([0-9]+)page([0-9]+).html$/type.php?typeid=$1&page=$2[PT]

相信通过以上四个简单的例子,我们已经能够写出简单的ApacheRewrite的URL跳转了。

相关推荐