`
lvjun106
  • 浏览: 438150 次
  • 性别: Icon_minigender_1
  • 来自: 芜湖
社区版块
存档分类
最新评论

实例讲解Apache,rewrite规则/rewrite简介

 
阅读更多

转:http://www.path8.net/tn/archives/1361

 

1、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。

2、举例说明:

下面是在一个虚拟主机里定义的规则。功能是把client请求的主机前缀不是www.colorme.com和 203.81.23.202都跳转到主机前缀为http://www.path8.net,避免当用户在地址栏写入http://path8.net时不能以会员方式登录网站。
NameVirtualHost 192.168.100.8:80
<VirtualHost 192.168.100.8:80>
ServerAdmin webmaster@path8.net
DocumentRoot "/web/webapp"
ServerName www.path8.net
ServerName path8.net
RewriteEngine on  #打开rewirte功能
RewriteCond %{HTTP_HOST} !^www.path8.net [NC] #声明Client请求的主机中前缀不是www.path8.net,[NC]的意思是忽略大小写
RewriteCond %{HTTP_HOST} !^203.81.23.202 [NC]  #声明Client请求的主机中前缀不是203.81.23.202,[NC]的意思是忽略大小写
RewriteCond %{HTTP_HOST} !^$  #声明Client请求的主机中前缀不为空,[NC]的意思是忽略大小写
RewriteRule ^/(.*) http://www.path8.net/ [L] #含义是如果Client请求的主机中的前缀符合上述条件,则直接进行跳转到http://www.path8.net/, [L]意味着立即停止重写操作,并不再应用其他重写规则。这里的.*是指匹配所有URL中不包含换行字符,()括号的功能是把所有的字符做一个标记,以便于后面的应用.就是引用前面里的(.*)字符。
</VirtualHost>

例二.将输入 folio.path8.net 的域名时跳转到profile.path8.net

listen 8080
NameVirtualHost 10.122.89.106:8080
<VirtualHost 10.122.89.106:8080>
ServerAdmin webmaster@path8.net
DocumentRoot "/usr/local/www/apache22/data1/"
ServerName profile.path8.net
RewriteEngine on
RewriteCond %{HTTP_HOST} ^folio.path8.net [NC]
RewriteRule ^/(.*) http://profile.path8.net/ [L]
</VirtualHost>

例三.赛卡软件近期更换了域名,新域名为www.sicasoft.com, 更加简短好记。这时需要将原来的域名ss.kiya.cn, 以及论坛所在地址bbs.path8.net/定向到新的域名,以便用户可以找到,并且使原来的论坛 URL 继续有效而不出现 404 未找到,比如原来的http://bbs.path8.net/tread-60.html, 让它在新的域名下继续有效,点击后转发到http://bbs.sicasoft.com/tread-60.html,而其他网页,如原先的http://ss.kiya.cn/purchase不会到二级域名bbs.sicasoft.com/purchase上,而是到www.sicasoft.com/purchase
按照这样的要求重定向规则应该这样写:

RewriteEngine On
RewriteCond %{REQUEST_URI} ^/bbs/
RewriteRule ^bbs/(.*) http://bbs.sicasoft.com/$1 [R=permanent,L]
RewriteCond %{REQUEST_URI} !^/bbs/
RewriteRule ^(.*) http://www.sicasoft.com/$1 [R=permanent,L]

3.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=zed
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) 设置环境变量

4.Apache rewrite例子集合

在 httpd 中将一个域名转发到另一个域名
虚拟主机世界近期更换了域名,新域名为 www.wbhw.com, 更加简短好记。这时需要将原来的域名 webhosting-world.com, 以及论坛所在地址 webhosting-world.com/forums/ 定向到新的域名,以便用户可以找到,并且使原来的论坛 URL 继续有效而不出现 404 未找到,比如原来的 http://www. webhosting-world.com/forums/-f60.html, 让它在新的域名下继续有效,点击后转发到 http://bbs.wbhw.com/-f60.html, 这就需要用 apache 的 Mod_rewrite 功能来实现。

在< virtualhost> 中添加下面的重定向规则:

RewriteEngine On
# Redirect webhosting-world.com/forums to bbs.wbhw.com
RewriteCond %{REQUEST_URI} ^/forums/
RewriteRule /forums/(.*) http://bbs.wbhw.com/$1 [R=permanent,L]

# Redirect webhosting-world.com to wbhw.com
RewriteCond %{REQUEST_URI} !^/forums/
RewriteRule /(.*) http://www.wbhw.com/$1 [R=permanent,L]

添加了上面的规则以后, 里的全部内容如下:
< virtualhost *:80>
ServerAlias webhosting-world.com
ServerAdmin admin@webhosting-world.com
DocumentRoot /path/to/webhosting-world/root
ServerName www.webhosting-world.com

RewriteEngine On
# Redirect webhosting-world.com/forums to bbs.wbhw.com
RewriteCond %{REQUEST_URI} ^/forums/
RewriteRule /forums/(.*) http://bbs.wbhw.com/$1 [R=permanent,L]

# Redirect webhosting-world.com to wbhw.com
RewriteCond %{REQUEST_URI} !^/forums/
RewriteRule /(.*) http://www.wbhw.com/$1 [R=permanent,L]
< /virtualhost>

URL重定向例子一:
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 的功能

RewriteEngine On
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\.com http://www.zzz.com/user.php?username=$1

例子二:
/type.php?typeid=* --> /type*.html
/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]

5.使用Apache的URL Rewrite配置多用户虚拟服务器

<iframe id="aswift_1" style="margin: 0px; padding: 0px; border-width: 0px; vertical-align: baseline; left: 0px; position: absolute; top: 0px;" name="aswift_1" frameborder="0" marginwidth="0" marginheight="0" scrolling="no" width="468" height="60"></iframe>

要实现这个功能,首先要在DNS服务器上打开域名的泛域名解析(自己做或者找域名服务商做)。比如,我就把 *.path8.net和 *.semcase.cn全部解析到了我的这台Linux Server上。

然后,看一下我的Apache中关于*.path8.net的虚拟主机的设定。

#*.com,*.osall.net
<VirtualHost *:80>
ServerAdmin webmaster@path8.net
DocumentRoot /home/www/www.path8.net
ServerName dns.path8.net
ServerAlias dns.path8.net path8.net semcase.net *.path8.net *.semcase.net
CustomLog /var/log/httpd/osa/access_log.log" common
ErrorLog /var/log/httpd/osa/error_log.log"
<Directory /home/www/www.path8.net>
AllowOverride None
Order deny,allow
#AddDefaultCharset GB2312
</Directory>
<IfModule mod_rewrite.c>
RewriteEngine on
RewriteCond %{HTTP_HOST} ^[^.]+\.osall\.(com|net)$
RewriteRule ^(.+) %{HTTP_HOST}$1 [C]
RewriteRule ^([^.]+)\.osall\.(com|net)(.*)$ /home/www/www.path8.net/sylvan$3?un=$1&%{QUERY_STRING} [L] </IfModule>
</VirtualHost>

在这段设定中,我把*.semcase.net和*.path8.net 的Document Root都设定到了 /home/www/www.path8.net
但是,继续看下去,看到<IfModule mod_rewrite.c>...</IfModule>配置了吗?在这里我就配置了URL Rewrite规则。

RewriteEngine on #打开URL Rewrite功能
RewriteCond %{HTTP_HOST} ^[^.]+.osall.(com|net)$ #匹配条件,如果用户输入的URL中主机名是类似 xxxx.path8.net 或者 xxxx.semcase.cn 就执行下面一句
RewriteRule ^(.+) %{HTTP_HOST}$1 [C] #把用户输入完整的地址(GET方式的参数除外)作为参数传给下一个规则,[C]是Chain串联下一个规则的意思
RewriteRule ^([^.]+).osall.(com|net)(.*)$ /home/www/dev.path8.net/sylvan$3?un=$1&%{QUERY_STRING} [L] # 最关键的是这一句,使用证则表达式解析用户输入的URL地址,把主机名中的用户名信息作为名为un的参数传给 /home/www/dev.path8.net目录下的脚本,并在后面跟上用户输入的GET方式的传入参数。并指明这是最后一条规则([L]规则)。注意,在这一句中指明的重写后的地址用的是服务器上的绝对路径,这是内部跳转。如果使用http://xxxx这样的URL格式,则被称为外部跳转。使用外部跳转的话,浏览着的浏览器中的URL地址会改变成新的地址,而使用内部跳转则浏览器中的地址不发生改变,看上去更像实际的二级域名虚拟服务器。

这样设置后,重起Apache服务器,测试一下,就大功告成了!

求Rewrite 防盗链正则
不允许www.im286.com www.chinaz.com 这两个网站盗链 , 其它的网站都可以盗链的规则怎么写.

论坛中的答案是:
RewriteEngine On
RewriteCond %{HTTP_REFERER} chinaz.com [NC]
RewriteCond %{HTTP_REFERER} im286.com [NC]
RewriteRule .*\.(jpg|jpeg|gif|png|rar|zip|txt|ace|torrent|gz|swf)$ http://www.xxx.com/fuck.png [R,NC,L]

一、关于是否需要使用完全转义,比如在 RewriteCond %{HTTP_REFERER} chinaz.com [NC] 中把 chinaz.com 改成 chinaz\.com
答案是,两者都是可以的。

二、今天在做 YOURcaddy.com (就是我去年做的PlanetCoachella的变形)的时候,在 GoDaddy 主机上无法正常转向,后来找到了问题:
在HostMonster以及我自己的机器上,是用
RewriteRule ^business/([^\.]+)$ biz/detail.php?name=$1 [L]
达到改写的。而在Godaddy主机上,是这样:
RewriteRule ^business/([^\.]+)$ /biz/detail.php?name=$1 [L]
目标文件前多了一个/
现在想想,可能是因为没有指定RewriteBase,至于到底是不是我改日再验证一下。

三、添加两个关于判断 USER AGENT 例子和自动添加.php扩展名及自动换.html到.php扩展名的例子:
1

RewriteEngine on
RewriteCond %{HTTP_USER_AGENT} ^MSIE [NC,OR]
RewriteCond %{HTTP_USER_AGENT} ^Opera [NC]
RewriteRule ^.* – [F,L] 这里”-”表示没有替换,浏览器为IE和Opera的访客将被禁止访问。

2

RewriteEngine On
RewriteBase /test
RewriteCond %{REQUEST_FILENAME}.php -f
RewriteRule ([^/]+)$ /test/$1.php
#for example: /test/admin => /test/admin.php
RewriteRule ([^/]+)\.html$ /test/$1.php [L]
#for example: /test/admin.html => /test/admin.php

限制目录只能显示图片

< IfModule mod_rewrite.c>
RewriteEngine on
RewriteCond %{REQUEST_FILENAME} !^.*\.(gif|jpg|jpeg|png|swf)$
RewriteRule .*$ – [F,L]
< /IfModule>

补充,关于特定文件扩展名的重写。

重写有某些扩展名的文件:
RewriteRule (.*.css$|.*.js$) gzip.php?$1 [L]
如果要排除一些扩展名:
RewriteRule !\.(js|ico|gif|jpg|JPG|png|PNG|css|pdf|swf)$ index.php

分享到:
评论

相关推荐

    实例讲解nginx的rewrite规则

    ### 实例讲解Nginx的rewrite规则 #### 正则表达式匹配 在Nginx中,使用`rewrite`指令可以实现对URL的重写,其中涉及到正则表达式的匹配方式有以下几种: 1. **区分大小写的匹配**:使用`~`符号,例如:`rewrite ^/...

    webServer / Apache / apache / apache http server / mod_cluster

    Apache HTTP Server的核心功能包括处理HTTP协议,静态内容服务,以及通过各种模块(如mod_rewrite、mod_proxy等)支持动态内容和反向代理。在大型部署中,为了提高系统的可扩展性和可靠性,通常会使用负载均衡技术,...

    浅谈apache和nginx的rewrite的区别

    1. Nginx Rewrite规则相关指令 Nginx Rewrite规则相关指令有if、rewrite、set、return、break等,其中rewrite是最关键的指令。一个简单的Nginx Rewrite规则语法如下: ...2. Nginx与Apache的Rewrite规则实例对比  简单

    urlrewrite地址重写实例配置说明

    URLRewrite通常与Apache的mod_rewrite或者在Java Web应用中的Tuckey's URLRewriteFilter一起使用。以下将详细介绍URLRewrite的工作原理和实例配置。 **1. URLRewrite工作原理** URLRewrite基于HTTP请求的过程,...

    nginx rewrite规则

    与Apache的`mod_rewrite`模块相比,Nginx的`rewrite`规则在语法和工作方式上有所不同,这使得理解并熟练掌握Nginx的`rewrite`规则成为提升服务器配置能力的关键。 **1. Nginx与Apache的Rewrite规则对比** Apache的...

    URLrewrite-实例

    `URLrewrite`是一个基于Java的开源过滤器,它实现了Apache的mod_rewrite功能,广泛应用于Spring、Struts、JSF等Java Web框架中。它提供了强大的规则配置,使得开发者能够灵活地对URL进行重写和重定向。 在使用`URL...

    urlrewrite 完整实例,可直接运行。支持多个参数传递

    在Java Web开发中,它经常与Apache Tomcat服务器配合使用,通过配置规则来实现动态URL到静态URL的映射,以及对URL进行各种操作,如添加、修改或删除请求参数。以下是对`URLRewrite`的详细解释和使用实例: 一、URL...

    伪静态URLRewrite实例解析

    ### 伪静态URLRewrite实例解析 #### 一、伪静态URLRewrite概念与作用 在Web开发领域,为了提高用户体验、便于搜索引擎抓取以及优化网站结构,常常需要对URL进行美化处理,这就是所谓的“伪静态”。通过将动态URL...

    Apress.The.Definitive.Guide.to.Apache.mod.rewrite.Feb.2006.pdf

    《Apache mod_rewrite 权威指南》不仅限于理论讲解,还提供了丰富的实战案例,涵盖了从简单的 URL 重定向到复杂的网站架构调整。这些案例分析有助于读者将所学知识应用于实际场景,提高解决具体问题的能力。 ### 五...

    url rewrite filter实例

    在URF-Demo项目中,你可以找到一个完整的实例,它可能包括了多个规则的设置以及与后端控制器的交互。通过分析这个示例,你可以了解到如何根据实际需求自定义URL重写规则,如处理动态参数、使用正则表达式等。 使用...

    关于Apache_mod_rewite的中文配置和RewriteRule规则详细介绍

    关于Apache_mod_rewrite的中文配置与RewriteRule规则详细介绍 在当今互联网时代,网站优化与安全性是网站管理员关注的焦点。Apache_mod_rewrite作为一个强大的工具,它不仅能够帮助网站优化URL结构,提升用户体验,...

    urlrewrite

    本文将重点讲解Java环境下的URL重写工具——URLRewrite,并深入探讨其工作原理、配置与应用。 一、URLRewrite简介 URLRewrite是基于Apache开源项目Tuckey开发的一款强大的URL管理过滤器,它可以方便地进行URL重写...

    urlrewrite2伪静态与使用文档(IIS)

    这个文档很可能包含了urlrewrite2的详细配置指南、规则语法解析、常见问题解答以及如何在IIS与PHPWAMP环境下进行配置的实例。建议仔细阅读该文档,以便深入理解和熟练运用urlrewrite2。 总之,urlrewrite2在IIS环境...

    ISAPI_Rewrite3的安装和使用

    官方文档提供了详细的规则语法和实例,是学习的好资源。在调试过程中,可以开启日志功能,观察请求处理的全过程,找出问题所在。 总之,ISAPI_Rewrite3是IIS服务器中一个非常实用的URL管理和优化工具,通过灵活的...

    apache+tomcat集群配置

    prefix=/opt/apache --enable-modules=so --enable-mods-shared=all --enable-proxy --enable-proxy-connect --enable-proxy-ftp --enable-proxy-http --enable-proxy-ajp --enable-proxy-balancer --enable-rewrite...

    使用URL Rewrite实现网站的伪静态实例(urlrewritefilter-4.0.3)

    在这个实例中,我们将深入探讨如何利用`URL Rewrite`工具,特别是`UrlRewriteFilter 4.0.3`版本,来实现网站的伪静态功能。 `UrlRewriteFilter`是一个基于Apache开源项目Tuckey的Java过滤器,用于在Web应用中执行...

    Nginx Rewrite规则与使用介绍和技巧实例

    Nginx的rewrite规则编写实例展示了在不同情况下如何应用rewrite规则来满足特定的业务需求: 1. 当访问的文件或目录不存在时,可以重定向到指定的PHP文件,以避免返回404错误页面。 2. 通过正则表达式可以对请求的...

    nginx中location中关于proxy_pass和rewrite的应用.rar

    - 使用`proxy_pass`时,注意URL路径的相对性和绝对性,以及与`rewrite`规则的匹配关系。 理解并熟练运用`proxy_pass`和`rewrite`,可以极大地增强Nginx的灵活性和功能性,满足各种复杂的Web服务需求。在实际部署中...

    urlrewrite_demo

    例如,项目可能包含了一个简单的Java控制器,展示了如何配合过滤器实现URL重定向,以及一个`urlrewrite.xml`文件,展示了多种URL重写和重定向的规则实例。 通过深入学习和实践`urlrewrite`,开发者不仅可以优化应用...

Global site tag (gtag.js) - Google Analytics