当前位置 主页 > 服务器问题 > Linux/apache问题 >

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

    栏目:Linux/apache问题 时间:2018-11-28 13:57

    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.iis7.com和70.40.213.183都跳转到主机前缀为//www.iis7.com,避免相同内容的网页有多个指向的域名,如http://jb51.net。
    复制代码 代码如下:
    NameVirtualHost 70.40.213.183:80
    ServerAdmin slj@jb51.net
    DocumentRoot “/web”
    ServerName jb51.net

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

    例二.将输入 en.jb51.net 的域名时跳转到www.iis7.com
    复制代码 代码如下:
    RewriteEngine on
    RewriteCond %{HTTP_HOST} ^en.jb51.net [NC]
    RewriteRule ^(.*) //www.iis7.com/ [L]

    例三.赛卡软件近期更换了域名,新域名为www.iis7.com, 更加简短好记。这时需要将原来的域名ss.jb51.net, 以及论坛所在地址ss.jb51.net/bbs/定向到新的域名,以便用户可以找到,并且使原来的论坛 URL 继续有效而不出现 404 未找到,比如原来的http://ss.jb51.net/bbs/tread-60.html, 让它在新的域名下继续有效,点击后转发到http://bbs.jb51.net/tread-60.html,而其他网页,如原先的http: //ss.jb51.net/purchase不会到二级域名bbs.jb51.net/purchase上,而是到 www.iis7.com/purchase
    按照这样的要求重定向规则应该这样写:
    复制代码 代码如下:
    RewriteEngine On
    RewriteCond %{REQUEST_URI} ^/bbs/
    RewriteRule ^bbs/(.*) http://bbs.jb51.net/$1 [R=permanent,L]
    RewriteCond %{REQUEST_URI} !^/bbs/
    RewriteRule ^(.*) //www.iis7.com/$1 [R=permanent,L]

    3.Apache mod_rewrite规则重写的标志一览
    复制代码 代码如下:
    1) R[=code](force redirect) 强制外部重定向
    强制在替代字符串加上http://thishost[:thisport]/前缀重定向到外部的URL.如果code不指定,将用缺省的302 HTTP状态码。