`
andrew1024
  • 浏览: 74786 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

Rewrite规则

阅读更多
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.kiya.cn和70.40.213.183都跳转到主机前缀为http://www.kiya.cn,避免相同内容的网页有多个指向的域名,如http://kiya.cn。

    NameVirtualHost 70.40.213.183:80
    ServerAdmin slj@kiya.cn
    DocumentRoot “/web”
    ServerName kiya.cn

    RewriteEngine on #打开rewirte功能
    RewriteCond %{HTTP_HOST} !^www.kiya.cn [NC] #声明Client请求的主机中前缀不是www.kiya.cn,其中 [NC] 的意思是忽略大小写
    RewriteCond %{HTTP_HOST} !^70.40.213.183 [NC] #声明Client请求的主机中前缀不是70.40.213.183,其中 [NC] 的意思是忽略大小写
    RewriteCond %{HTTP_HOST} !^$ #声明Client请求的主机中前缀不为空
    RewriteRule ^(.*) http://www.kiya.cn/ [L] #含义是如果Client请求的主机中的前缀符合上述条件,则直接进行跳转到http://www.kiya.cn/,[L]意味着立即停止重写操作,并不再应用其他重写规则。这里的.*是指匹配所有URL中不包含换行字符,()括号的功能是把所有的字符做一个标记,以便于后面的应用.就是引用前面里的 (.*)字符。

例二.将输入 en.sicasoft.com 的域名时跳转到www.sicasoft.com

    RewriteEngine on
    RewriteCond %{HTTP_HOST} ^en.sicasoft.com [NC]
    RewriteRule ^(.*) http://www.sicasoft.com/ [L]

例三.赛卡软件近期更换了域名,新域名为www.sicasoft.com, 更加简短好记。这时需要将原来的域名ss.kiya.cn, 以及论坛所在地址ss.kiya.cn/bbs/定向到新的域名,以便用户可以找到,并且使原来的论坛 URL 继续有效而不出现 404 未找到,比如原来的http://ss.kiya.cn/bbs/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) 与下一条规则关联

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

    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) 设置环境变量

4.Apache rewrite例子集合
来源:(http://blog.sina.com.cn/s/blog_4c9ba2850100fyzy.html) - Rewrite规则_网友_新浪博客

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配置多用户虚拟服务器

要实现这个功能,首先要在DNS服务器上打开域名的泛域名解析(自己做或者找域名服务商做)。比如,我就把 *.kiya.us和 *.kiya.cn全部解析到了我的IP地址70.40.213.183上。

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

    ServerAdmin webmaster@kiya.us
    DocumentRoot /home/www/www.kiya.us
    ServerName dns.kiya.us
    ServerAlias dns.kiya.us kiya.us *.kiya.us
    CustomLog /var/log/httpd/osa/access_log.log” common
    ErrorLog /var/log/httpd/osa/error_log.log”
    AllowOverride None
    Order deny,allow

    #AddDefaultCharset GB2312

    RewriteEngine on
    RewriteCond %{HTTP_HOST} ^[^.]+.kiya.(cn|us)$
    RewriteRule ^(.+) %{HTTP_HOST}$1 [C]
    RewriteRule ^([^.]+).kiya.(cn|us)(.*)$ /home/www/www.kiya.us/sylvan$3?un=$1&%{QUERY_STRING} [L]

在这段设定中,我把*.kiya.cn和*.kiya.us 的Document Root都设定到了 /home/www/www.kiya.us

继续看下去,在这里我就配置了URL Rewrite规则。

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

设置后重启Apache服务器就大功告成了!
分享到:
评论

相关推荐

    AMH-Rewrite规则

    其中,“AMH-Rewrite 规则”主要指的是 AMH 集成的 Nginx 服务器中关于 URL 重写规则的配置和应用。 URL 重写是 web 服务器处理请求的一种技术,常用于优化网站 URL 结构,隐藏真实路径,提高搜索引擎优化(SEO)...

    discuz的rewrite规则下载

    作为一款知名的论坛系统,其官方提供了一套专门用于URL重写的规则,即“Rewrite规则”。本文旨在对这些规则进行详细的解析,并指导用户如何正确地应用这些规则。 #### 二、Rewrite规则基础概念 在深入解析Discuz!...

    专业针对DZ6[1].0+DZ6.1论坛+UCHome Rewrite规则.rar

    本知识点将详细讲解如何为DZ6.0及DZ6.1论坛和UCHome配置Rewrite规则,以实现URL的伪静态化,提升网站的SEO友好性和用户体验。 首先,Rewrite规则是一种基于Apache服务器的mod_rewrite模块功能,它允许我们通过定义...

    Nginx的Rewrite规则与实例

    ### Nginx的Rewrite规则与实例:深入解析与应用 在现代Web服务器管理与运维领域,Nginx因其高效、稳定以及丰富的功能而备受推崇。其中,Rewrite模块是Nginx的一项重要特性,它允许管理员对HTTP请求进行重写、重定向...

    nginx配置location总结及rewrite规则写法

    nginx配置location总结及rewrite规则写法

    nginx设置rewrite规则

    下面将详细介绍如何在LNMP环境中配置Nginx的rewrite规则。 首先,了解rewrite规则的基本概念。Nginx的rewrite模块允许我们根据特定的条件重写请求的URI,这在实现URL路由、隐藏真实路径、SEO优化等方面非常有用。它...

    url重写软件rewrite规则

    标题中的“url重写软件rewrite规则”涉及到的是网站优化和管理的一个重要概念——URL重写。URL重写是通过特定的规则(通常基于HTTP服务器的模块,如IIS的URL Rewrite模块)将用户请求的不友好的、动态的或者包含查询...

    实例讲解nginx的rewrite规则

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

    Discuz! X2 配置URL伪静态Rewrite规则

    Discuz! X2 配置URL伪静态Rewrite规则,里面详细讲解了apache服务器下 Discuz! X2 配置URL伪静态Rewrite规则和IIS下得Discuz! X2 配置URL伪静态Rewrite规则

    nginx rewrite规则怎么配置-.docx

    **Nginx Rewrite规则配置详解** 在Web服务器优化和URL管理中,Nginx的Rewrite规则扮演着重要角色。它允许我们根据特定条件重写请求的URL,从而实现动态URL到静态URL的转换、URL规范化、路径重定向等。Nginx的...

    如何在Apache 服务器下配置URL 静态化的 Rewrite 规则.docx

    ### 如何在Apache服务器下配置URL静态化的Rewrite规则 #### 一、了解URL静态化与Rewrite规则 **URL静态化**是指将原本动态的URL(如包含多个参数的PHP页面)转换成类似静态页面的形式(如.html或.htm)。这种做法...

    Apache服务器下配置URL 态化的Rewrite规则.docx

    Apache服务器下的URL重写(Rewrite)规则是用于实现URL静态化的重要技术,这...总的来说,Apache的Rewrite规则是一个强大的工具,能够帮助开发者灵活地控制和转换网站的访问路径,从而提高网站的性能和搜索引擎的可见性。

    HDwiki 5.1下iis的rewrite规则分享

    一、注意事项: 1、本功能对服务器环境有特殊要求,独立主机用户需要对 Web 服务器增加相应的 Rewrite 规则,因此需要服务器权限才可使用。对于虚拟主机用户,您需要向您的空间服务商进行咨询:空间是否支持 Rewrite...

    nginx rewrite规则

    Nginx与Apache的Rewrite规则对比** Apache的`mod_rewrite`基于Perl兼容正则表达式(Perl Compatible Regular Expressions, PCRE)进行URL重写,通常在`.htaccess`文件中配置。而Nginx的`rewrite`规则则直接在服务器...

    iis_rewrite.zip

    (如果没有选择此目录的 Rewrite.dll文件,请手工添加此目录下的httpd.ini中的Rewrite规则); 2.重新启动IIS; 3.进入记事狗后台->系统设置->URL地址设置,选择Rewrite方式为 标准Rewrite模式; 4.URL标准静态化...

    nginx配置location总结location正则写法及rewrite规则写法

    `location` 的正则写法和 `rewrite` 规则是 Nginx 配置中的高级特性,用于实现灵活的URL管理和重定向。 1. **location 正则写法** - `location = /{}`:精准匹配,只有当请求的URI完全等于 `/` 时才匹配,不接受...

    ISAPI_Rewrite常用规则

    ISAPI_Rewrite是IIS服务器上一个强大的URL重写引擎,它允许用户自定义URL重写规则,实现诸如301重定向、伪静态化等功能。这些功能在网站优化、SEO策略实施以及提高用户体验方面扮演着关键角色。下面将详细解析ISAPI_...

Global site tag (gtag.js) - Google Analytics