`

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

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

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

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

例二.将输入 example.com 的域名时跳转到http:www.domain.cn

     RewriteEngine on
      RewriteCond %{HTTP_HOST} ^example.com [NC]
      RewriteRule ^(.*) http://www.domain.cn/ [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例子集合

URL重定向

例子一:
同时达到下面两个要求:
1.用http://www.domain.cn/xxx.php 来访问http://www.domain.cn/xxx/
2.用http://xiaoye.domain.cn 来访问 http://www.domain.cn/user.php?username=xiaoye的功能

     RewriteEngine On
      RewriteCond %{HTTP_HOST} ^www.domain.cn
      RewriteCond %{REQUEST_URI} !^user.php$
      RewriteCond %{REQUEST_URI} .php$
      RewriteRule (.*).php$ http://www.domain.cn/$1/ [R]
      RewriteCond %{HTTP_HOST} !^www.domain.cn
      RewriteRule ^(.+) %{HTTP_HOST} [C]
      RewriteRule ^([^.]+).domain.cn http://www.domain.cn/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服务器就大功告成了!
Update May 1, 2009

今天上网看到了有人提一个问题:

     求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]

Update May 7, 2009

介绍一篇文章:http://lamp.linux.gov.cn/Apache/ApacheMenu/mod/mod_rewrite.html

Update May 24, 2009

一、关于是否需要使用完全转义,比如在 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>

Update Jun 10, 2009

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

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

相关推荐

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

    Apache Rewrite模块是一个强大的URL重写工具,主要用于实现URL的跳转和重定向,它基于Perl兼容正则表达式(PCRE)语法。该模块可以在服务器配置级别(httpd.conf)和目录配置级别(.htaccess)进行使用。启用Rewrite...

    nginx rewrite 实现URL跳转的方法

    当需要将用户从旧域名跳转到新域名上时,可以使用如下的Rewrite规则: ``` server { listen 80; server_***; rewrite ".*" *** } ``` 这条规则的意思是,无论用户请求什么页面,都会将他们重定向到***域名上。...

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

    1.Apache Rewrite的主要功能 就是实现URL的跳转和隐藏真实地址,基于Perl语言的正则表达式规范。平时帮助我们实现拟静态,拟目录,域名跳转,防止盗链等 2.Apache Rewrite的配置 Apache下的Rewrite配置主要有两种,...

    Apache的Rewrite设置多域名301跳转到主域名的方法

    总之,Apache的Rewrite模块提供了强大的URL处理能力,通过合理的规则设置,可以实现多域名到主域名的301跳转,有效管理和优化网站的SEO策略。同时,注意处理好包含查询字符串的URL,确保重定向的准确性和搜索引擎...

    Apache开启伪静态

    Apache 的 Rewrite 模块提供了强大的 URL 重写功能,通过在配置文件中添加规则,能够实现复杂的 URL 转换和跳转。本文将详细介绍 Apache 开启伪静态的配置和应用。 一、加载 Rewrite 模块 要使用 Rewrite 模块,...

    PHP实例开发源码—微信域名防封三合一源码(单个域名跳转 多个域名跳转 浏览器打开).zip

    这通常涉及到URL重写和服务器配置,如Apache或Nginx的rewrite规则,以及PHP的header函数来实现HTTP状态码的改变和URL的跳转。 2. **多个域名跳转**:考虑到一个备用域名可能也会被封禁,源码还提供了多域名跳转的...

    二级域名管理插件(实现URL隐藏转发) for Discuz!7.2 GBK UTF8.rar

    实现URL的隐藏转发,例如:bbs.itopapp.com绑定到虚拟主机上的bbs目录,浏览器中不会跳转到http://www.itopapp.com/bbs了,而直接显示http://bbs.itopapp.com 。 2.域名管理   说明:安装成功后,提供了3个...

    apache设置自动将http跳转到https的方法

    实现HTTP到HTTPS的自动跳转,我们可以利用Apache的Rewrite模块,这个模块提供了URL重写功能,常用于实现SEO优化、路径简化或者如我们当前情况下的安全跳转。 以下是Apache配置的详细步骤: 1. **启用Rewrite模块**...

    Apache伪静态Rewrite详解

    Apache伪静态Rewrite技术是一种强大的URL重写工具,它允许开发者通过正则表达式来转换和控制用户请求的URL,从而实现对网站内容的动态处理而显示为静态页面的效果。这项技术对于SEO优化和用户体验提升有着重要作用,...

    详解HTTP状态码

    您可能感兴趣的文章:Nginx下301重定向域名的方法小结Apache Rewrite实现URL的301跳转和域名跳转比较详细的win2003 IIS6.0 301重定向带参数的问题解决方法IIS7.5下301重定向的设置方法(及伪静态后301重定向出错案例)...

    实例讲解nginx的rewrite规则

    ### 实例讲解Nginx的...通过上述实例和解释,我们可以看到Nginx中的`rewrite`规则是非常强大且灵活的,它不仅可以用于简单的URL重写,还可以根据不同的条件进行复杂的逻辑处理,从而实现更加高效和安全的服务配置。

    HTTP错误500.19解决方法(定义了重复的节点)

    打开服务器的asp.net页面时出现这个错误: ...无法访问请求的页面,因为该页的相关配置数据无效。... 您可能感兴趣的文章:Nginx下301重定向域名的方法小结Apache Rewrite实现URL的301跳转和域名跳转比

    Apache 重写规则的常见应用

    无论是简单的重定向还是复杂的URL模式匹配和替换,都可以通过合理的配置实现。当然,在实际操作过程中还需要注意一些细节,比如确保Apache已经加载了`mod_rewrite`模块,以及正确设置`RewriteBase`等参数,这样才能...

    apache虚拟主机配置

    5. **`LoadModule rewrite_module modules/mod_rewrite.so`**: 提供URL重写功能,用于实现SEO友好链接和安全策略。 #### 三、设置虚拟主机 在`httpd.conf`文件中包含`vhosts.conf`文件,该文件用于设置虚拟主机的...

    apache将不带www域名301重定向到带www的域名的配置方法

    这里`(.*)`捕获所有路径和查询字符串信息,并将它们包含在重定向URL中,确保用户能够正确到达目标页面。 4. **完整示例**: ```apache # 强制重定向到www RewriteEngine On RewriteCond %{HTTP_HOST} ^your...

    301重定向(nginx和Apache)

    Apache是目前最流行的Web服务器软件之一,其支持通过`.htaccess`文件实现重定向和URL重写。 **示例:** ```apacheconf # 针对baozifa.com的301重定向 RewriteCond %{HTTP_HOST} !^www.baozifa.com$ [NC] ...

    优化dis

    通过这个模块,可以实现URL的重写,从而可以做请求的重定向、伪静态、页面跳转等操作。 - **.htaccess文件**:这是一种分布式配置文件,允许用户在网站根目录或任何子目录下覆盖服务器级的配置指令。利用.htaccess...

    apache开启伪静态的方法分享

    Rewrite模块是Apache中一个非常强大的工具,用于实现URL重写,从而达到伪静态的效果。下面是一些基本的应用示例。 1. **请求跳转**: - 目标:如果请求的URL后缀为`.php`,则将其重定向到另一个域名对应的`.jsp`...

Global site tag (gtag.js) - Google Analytics