Apache,rewrite规则和四个实例讲解


Apache 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.colorme.com和203.81.23.202都跳转到主机前缀为http://www.1lou.net,避免当用户在地址栏写入http://1lou.net时不能以会员方式登录网站。NameVirtualHost 192.168.100.8:80

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

例二.将输入 folio.1lou.net 的域名时跳转到profile.1lou.netlisten 8080NameVirtualHost 10.122.89.106:8080

ServerAdminDocumentRoot “/usr/local/www/apache22/data1/”ServerName profile.1lou.netRewriteEngine onRewriteCond %{HTTP_HOST} ^folio.1lou.net [NC]RewriteRule ^/(.*) http://profile.1lou.net/ [L]

例三.赛卡软件近期更换了域名,新域名为www.sicasoft.com, 更加简短好记。这时需要将原来的域名ss.kiya.cn, 以及论坛所在地址bbs.1lou.net/定向到新的域名,以便用户可以找到,并且使原来的论坛 URL 继续有效而不出现 404 未找到,比如原来的http://bbs.1lou.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 OnRewriteCond %{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=zed13) PT(pass through to next handler) 传递给下一个处理例如:RewriteRule ^/abc(.*) /def$1 [PT] # 将会交给/def规则处理Alias /def /ghi14) 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.comRewriteCond %{REQUEST_URI} ^/forums/RewriteRule /forums/(.*) http://bbs.wbhw.com/$1 [R=permanent,L]

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

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

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

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

URL重定向例子一:1.http://www.zzz.com/**.php-> http://www.zzz.com/**/2.http://yyy.zzz.com-> http://www.zzz.com/user.php?username=yyy 的功能

RewriteEngine OnRewriteCond %{HTTP_HOST} ^www.zzz.comRewriteCond %{REQUEST_URI} !^user\.php$RewriteCond %{REQUEST_URI} \.php$RewriteRule (.*)\.php$ http://www.zzz.com/$1/ [R]

RewriteCond %{HTTP_HOST} !^www.zzz.comRewriteRule ^(.+) %{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服务器上打开域名的泛域名解析(自己做或者找域名服务商做)。比如,我就把 *.1lou.net和 *.semcase.cn全部解析到了我的这台Linux Server上。

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

#*.com,*.osall.net

ServerAdminDocumentRoot /home/www/www.1lou.netServerName dns.1lou.netServerAlias dns.1lou.net 1lou.net semcase.net *.1lou.net *.semcase.netCustomLog /var/log/httpd/osa/access_log.log” commonErrorLog /var/log/httpd/osa/error_log.log”

AllowOverride NoneOrder deny,allow#AddDefaultCharset GB2312

RewriteEngine onRewriteCond %{HTTP_HOST} ^[^.]+\.osall\.(com net)$RewriteRule ^(.+) %{HTTP_HOST}$1 [C]RewriteRule ^([^.]+)\.osall\.(com net)(.*)$ /home/www/www.1lou.net/sylvan$3?un=$1&%{QUERY_STRING} [L]

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

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

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

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

论坛中的答案是:RewriteEngine OnRewriteCond %{HTTP_REFERER} chinaz.com [NC]RewriteCond %{HTTP_REFERER} im286.com [NC]RewriteRule .*\.(jpg jpeg gif png rar zip txt ace torrent gz swf)$ [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 onRewriteCond %{HTTP_USER_AGENT} ^MSIE [NC,OR]RewriteCond %{HTTP_USER_AGENT} ^Opera [NC]RewriteRule ^.* – [F,L] 这里”-”表示没有替换,浏览器为IE和Opera的访客将被禁止访问。

2

RewriteEngine OnRewriteBase /testRewriteCond %{REQUEST_FILENAME}.php -fRewriteRule ([^/]+)$ /test/$1.php#for example: /test/admin => /test/admin.phpRewriteRule ([^/]+)\.html$ /test/$1.php [L]#for example: /test/admin.html => /test/admin.php

限制目录只能显示图片< IfModule mod_rewrite.c>RewriteEngine onRewriteCond %{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

标签: 规则, 实例
分类: 数码&电脑
时间: 2015-10-11

相关文章

  1. httpd.ini文件配置301永久重定向的实例代码

    只支持 http.ini伪静态规则的主机是最让人头疼的,因为有三个版本的伪静态规则:ISAPI_Rewrite 1.X,ISAPI_Rewrite2.X,ISAPI_Rewrite 3.x总共三个版本,向下兼容(也就是1 ...
  2. PHP如何实现网址伪静态

    PHP如何实现网址伪静态 Apache的 mod_rewrite是比较强大的,在进行网站建设时,可以通过这个模块来实现伪静态. 主要步骤如下: 1.检测Apache是否开启mod_rewrite功能 可以通过php提供的 ...
  3. apache通过.htaccess(rewrite)判断手机电脑跳转

    现在使用手机上网的用户越来越多,传统的网站模式显然不适合手机用户,这就需要专们为手机用户定制一个合适浏览的手机专属网站,网站虽然好建,自己写个手机模板,或者抓取现成大站的手机模板改改就行,但做好后如何让手机用户打开网站时 ...
  4. php中apache伪静态的简单入门

    现有的在线网上视频教程对伪静态的讲解比较简单,但不全面,我以一个真实案例来讲解伪静态的制作过程. 步骤开始: (1) 启用rewrite模块,在默认情况下,没有启用 修改httpd.conf文件,启动rewrite模块 ...
  5. APACHE 服务器开启URL REWRITE模块的方法

    最近做wordpress,发现固定链接总是设置不了.后来发现是由于apache服务器的URL REWIRITE模块没有开启导致. 查询了资料之后终于设置成功,记录下步骤:1:开启apache的url_rewrite模块, ...
  6. apache+iis6+ii7规则屏蔽域名(cdn服务器也有效)

    apache+iis6+ii7规则屏蔽域名,也同样适用于使用了cdn的服务器 方法/步骤 Linux下 规则文件.htaccess(手工创建.htaccess文件到站点根目录)<IfModule mod_rewri ...
  7. IIS 6.0 和APACHE 301重定向设置

    我所知道的常用的301重定向设置方法有2种.一个是通过IIS界面直接设置,另外一个是通过代码来实现301重定向设置.建议用服务器组件来做重定向,下面拿实例进行详细讲解. 1:IIS 服务器实现301 重定向不带WWW到带 ...
  8. Windows本地环境wordpress固定链接设置无效

    搭建了本地的apache+mysql+php 的环境,设置好固定链接后出现了Not Found The requested URL /wordpress/-/- was not found"的提示,解决办法如下 ...
  9. 万网Linux虚拟主机安装discuzx3.1设置URL静态化

    主要讲解万网Linux云虚拟主机安装discuz x3.1论坛设置URL静态化详细图文步骤,对于不知道如何具体设置的新手来说,这篇经验一定可以帮助你. 工具/原料 电脑 万网Linux虚拟主机 FlashFXP上传工具 ...
  10. Apache中 RewriteRule 规则参数介绍

    Apache中 RewriteRule 规则参数介绍 摘要: Apache模块 mod_rewrite 提供了一个基于正则表达式分析器的重写引擎来实时重写URL请求.它支持每个完整规则可以拥有不限数量的子规则以及附加条件 ...
  11. zblog php版本实现URL静态化(伪静态)方法

    网站的URL实现静态化虽然不是必要的,但是却是可以给你网站加分的,首先你自己和用户看着也舒服,不用再看那么多乱七八糟的符号了,其次搜索引擎抓取起来来方便,所以,如果能够实现URL静态化就尽量实现,利肯定大于弊. zblo ...
  12. zblog版本实现URL静态化

    网站的URL实现静态化虽然不是必要的,但是却是可以给你网站加分的,首先你自己和用户看着也舒服,不用再看那么多乱七八糟的符号了,其次搜索引擎抓取起来来方便,所以,如果能够实现URL静态化就尽量实现,利肯定大于弊. 方法/步 ...
  13. apache做301重定向的方法

    这里介绍两种apache做301的方法! 工具/原料 apache服务器一台 将不带www的定向到带www去 这里我使用mod_rewrite重写URL的方式来做,做之前朋友记得检查一下你的apache是否已经加载了re ...
  14. WordPress 开启多站点(Apache和Nginx)

    wordpress在开启多站点之后就会有着很好的扩展性,可以同时使用多套主题,实现多个模块的扩展. 方法/步骤 最近在windows平台上启动多占点使用的是wamp平台,实现很容易,但是在我的服务器上却出现重定向问题,所 ...
  15. 如何打开Apache的Rewrite功能

    伪静态用不了,请打开apache的Rewrite功能 工具/原料 apache2.2 方法/步骤 找到Apache的安装目录,打开配置文件,我本地的环境是D盘下面,具体的要看你的Apache的安装目录,打开httpd.c ...
  16. thinkphp开发的项目从Apache下移植到iis环境

    当一台vps上需要建立多个网站时,显然用win自带的iis配置网站要比Apache来的方便,且win+iis+php环境更适合新手网站管理员,所以,很多情况下,需要把网络公司用thinkphp开发的网站项目从Apache ...
  17. 伪静态规则写法

    众所周知,伪静态规则更有利于搜索引擎的收录,对排名也有一定的好处.但是很多站长朋友都不知道如果来写规则? 下面只是为享了一些实例,你的规则并不一定要完全和这个一样,可以根据这些实例来灵活运用! .htaccess 301 ...
  18. 飞飞CMS2.7自定义伪静态功能实例讲解

    [伪静态] 飞飞CMS2.7自定义伪静态功能实例讲解 2.7版将开放自定义伪静态功能,如果不使用系统默认的伪静态规则, 则需要自己编写, 现列出各页面的真实访问地址如下 视频栏目页 index.php?s=/Home-v ...
  19. PHPCMS伪静态的设置方法及注意事项

    工具/原料 PHPCMS程序 IIS/Apache/Linux.虚拟主机.VPS.独立主机 第一步:验证服务器或虚拟主机是否支持伪静态:①虚拟主机:询问主机提供商,看是否只是伪静态:②本地服务器:Apache 配置文件 ...