• Apache Rewrite规则笔记


    本文主要介绍Apache环境下,如何使用mod_rewrite模块完成URL重写功能。 

    开启mod_rewrite模块
    使用URL重写功能,需要安装mod_rewrite模块,查看已经加载的模块。
    # apachectl -D DUMP_MODULES
    Loaded Modules:
     core_module (static)
     …..
     rewrite_module (shared)
     rpaf_module (shared)

    如果没有开启mod_rewrite, 就需要配置mod_rewrite.so的路径: 
    LoadModule rewrite_module modules/mod_rewrite.so

    # a2enmod rewrite

    Apache2内置了mod_rewirte,在配置虚拟主机的配置文件VirtualHost部分打开引擎:RewriteEngine on

    这句之后就可以使用重写语法了,VirtualHost文件部分的Directory配置必须是: 
    <Directory /> 
    Options Includes FollowSymLinks #允许使用符号链接 
    AllowOverride All #允许目录配置文件.htaccess。如果不使用是AllowOverride None 
    </ Directory> 
    利用mod_rewrite重写URL主要使用两个基本的指令RewriteRule和RewriteCond。 

    RewriteRule指令
    RewriteRule Pattern Substitution [Flags] 
    在模式(Pattern)和替换(Substitution)中使用正则表达式来匹配相应的字符。 譬如有如下的URL: 
    http://www.example.com/display.php?country=USA &state=California&city=San_Diego 
    REQUEST_URI的值是“/country=USA &state=California&city=San_Diego”,要将国家州城市信息更友好的显示给用,要显示成这样: 
    http://www.example.com/USA/California/San_Diego 

    一个最常用的正则就是(.*)。它含有两个元素:一是“点”,表示任意字符;二是“星”,表示以前的全部字符。所以(.*)会匹配{REQUEST_URI}的所有字符。Rewrite重写引擎的输入串是{REQUEST_URI},也就是URL中出去域名以及“?”符号后的所有查询字符。重定向的URL中要提取出“USA/California/San_Diego”,匹配模式正则表达式的原型是: 
    (.*)/(.*)/(.*) 

    以上正则,在{REQUEST_URI}中通过两个“/”的分割存储了三个值,为了解决我们具体问题,我们得加一点限制――毕竟,第一个和最后一个原子可以匹配任何字符。

    开始,我们可以添加一些特殊的字符,比如表示正则“开始”或者“结束”,“^”字符表示正则的开始而“$”表示正则的结束。

    ^(.*)/(.*)/(.*)$ 
    {REQUEST_URI}是以“/”开头。Apache 在更改版本的时候会更改正则引擎,一代Apache要求有斜杠而二代Apache却不允许!但是我们可以用^/?(?表示匹配字符本身或者前一个字符)来兼容两个版本的Apache。再加上对字符匹配的限制,最终匹配模式是: 
    ^/?([a-zA-Z_]+)/([a-zA-Z_]+)/([a-zA-Z_]+)$ 

    完整表示如下: 
    RewriteEngine on 
    RewriteRule ^/?([a-zA-Z_]+)/([a-zA-Z_]+)/([a-zA-Z_]+)$ display.php?country=$1 &state=$2&city=$3 [L] 
    RewriteRule使用$1到$9引用模式()中匹配的内容,称为反向引用。对于URL: 
    http://www.example.com/USA/California/San_Diego 
    $1=USA,$2=California,$3=San_Diego 

    RewriteRule选项
    "redirect|R[=code]" 强制重定向,经常引用到触发可见的定向。默认情况下它是一个HTTP 302的临时重定向,但是你可以注明具体的HTTP 代码,比如你可以用[R=301]来表明这是一个永久重定向,这对搜索引擎抓取你重定向后的网页相当有用。

    "proxy|P"   强制为代理 

    "forbidden|F"   403 禁止,告诉Apache响应请求时不提供页面。其原理就是Apache会发出一个403 HTTP相应,可以保护网站不被未经授权的或者其他盗链访问。

    "nocase|NC" 忽略正则表达式中的大小写。它经常被用到{HTTP_HOST}服务器参数上,因为域名里面是不会区分大小写的。

    "next|N"    回到第一条规则。可以让你的重写条件循环匹配,当你不知道{REQUEST_URI}有多少字符进行匹配的时候很有用。
     
    "last|L"    最后一个规则。告诉Apache服务器一系列的条件或者是规则将在它出现后结束,换句话说就是[L]不出现,mod_rewrite将会一直执行。

    "noescape|NE"      在输出中不对URI作转义。此标记阻止mod_rewrite对重写结果应用常规的URI转义规则。
    一般情况下,特殊字符(如‘%’, ‘$’, ‘;’等)会被转义为等值的十六进制编码。 此标记可以阻止这样的转义,以允许百分号等符号出现在输出中,如: 
    RewriteRule /foo/(.*) /bar?arg=P1\%3d$1 [R,NE] 
    可以使‘/foo/zed’转向到一个安全的请求‘/bar?arg=P1=zed’. 

    "skip|S=N" 跳过下面的N条规则。 
     
    RewriteCond指令
    RewriteCond TestString CondPattern [Flags] 
    RewriteCond指令定义了一个规则的条件,即在一个RewriteRule指令之前有一个或多个RewriteCond指令。 条件之后的重写规则仅在当前URI与pattern匹配并且符合这些条件的时候才会起作用。 
    RewriteCond也有反向引用,但和RewriteRule中用$N引用不同,它使用%N反向引用。 
    RewriteCond引用Apache变量%{ NAME_OF_VARIABLE},如%{HTTP_HOST}。

    RewriteCond的条件模式(CondPattern)除了使用perl样式正则表达式,还有额外的规则: 
    1. 使用‘!’ 字符(惊叹号)来实现匹配的反转 
    2. ‘<CondPattern’ (词典顺序的小于)。将CondPattern视为纯字符串,与TestString以词典顺序相比较. 如果按词典顺序,TestString小于CondPattern,则为真。类似还有>,=。 
    3. ‘-d’ (是一个目录[directory])。将TestString视为一个路径名并测试它是否存在而且是一个目录. 
    4. ‘-f’ (是一个常规的文件[file])。将TestString视为一个路径名并测试它是否存在而且是一个常规的文件. 
    5. ‘-s’ (是一个非空的常规文件[size])。将TestString视为一个路径名并测试它是否存在而且是一个尺寸大于0的常规的文件. 
    6. ‘-l’ (是一个符号连接[link])。将TestString视为一个路径名并测试它是否存在而且是一个符号连接. 
    7. ‘-F’ (对子请求有效的业已存在的文件)。测试TestString是否一个有效的文件, 而且可以被服务器当前已经配置的所有存取控制所存取。 它用一个内部子请求来做判断,由于会降低服务器的性能,请小心使用! 

    RewriteCond选项
    ‘nocase|NC’ (no case)。它使测试忽略大小写。此标记仅作用于TestString和CondPattern的比较, 而对文件系统和子请求的测试不起作用。

    ‘ornext|OR’ (or next condition)。它以OR方式组合若干规则的条件,而不是默认的AND。典型的例子如下: 
    RewriteCond %{REMOTE_HOST} ^host1.* [OR] 
    RewriteCond %{REMOTE_HOST} ^host2.* [OR] 
    RewriteCond %{REMOTE_HOST} ^host3.* 
    RewriteRule …some special stuff for any of these hosts… 
    如果不用这个标记,则必须使用三个条件/规则。 
     
    服务器变量
    HTTP变量 
    HTTP_USER_AGENT, HTTP_REFERER, HTTP_COOKIE, HTTP_FORWARDED, HTTP_HOST, HTTP_PROXY_CONNECTION, HTTP_ACCEPT 

    连结和请求的变量 
    REMOTE_ADDR, REMOTE_HOST, REMOTE_USER, REMOTE_IDENT, REQUEST_METHOD, SCRIPT_FILENAME, PATH_INFO, QUERY_STRING, AUTH_TYPE 

    服务器内部变量 
    DOCUMENT_ROOT, SERVER_ADMIN, SERVER_NAME, SERVER_ADDR, SERVER_PORT, SERVER_PROTOCOL, SERVER_SOFTWARE 

    系统变量 
    TIME_YEAR, TIME_MON, TIME_DAY, TIME_HOUR, TIME_MIN, TIME_SEC, TIME_WDAY, TIME 

    mod_rewrite特殊值
    API_VERSION, THE_REQUEST, REQUEST_URI, REQUEST_FILENAME 
     
    URL重写举例
    1. 给子域名加www标记 
    RewriteCond %{HTTP_HOST} ^([a-z.]+)?example.com$ [NC] 
    RewriteCond %{HTTP_HOST} !^www. [NC] 
    RewriteRule .? http://www.%1example.com%{REQUEST_URI} [R=301,L] 
    这个规则抓取二级域名的%1变量,如果不是以www开始,那么就加www,以前的域名以及{REQUEST_URI}会跟在其后。 

    2. 去掉域名中的www标记 
    RewriteCond %{HTTP_HOST} !^example.com$ [NC] 
    RewriteRule .? http://example.com%{REQUEST_URI} [R=301,L] 
     
    3. 去掉www标记,但是保存子域名
    RewriteCond %{HTTP_HOST} ^www.(([a-z0-9_]+.)?example.com)$ [NC] 
    RewriteRule .? http://%1%{REQUEST_URI} [R=301,L] 
    这里,当匹配到1%变量以后,子域名才会在%2(内部原子)中抓取到,而我们需要的正是这个%1变量。 
     
    4.防止图片盗链
    一些站长不择手段的将你的图片盗链在他们网站上,耗费你的带宽。你可以加一下代码阻止这种行为。 
    RewriteCond %{HTTP_REFERER} !^$ 
    RewriteCond %{HTTP_REFERER} !^http://(www.)?example.com/ [NC] 
    RewriteRule .(gif|jpg|png)$ – [F] 
    如果{HTTP_REFERER}值不为空,或者不是来自你自己的域名,这个规则用[F]FLAG阻止以gif|jpg|png 结尾的URL ,如果对这种盗链你是坚决鄙视的,你还可以改变图片,让访问盗链网站的用户知道该网站正在盗用你的图片。 
    RewriteCond %{HTTP_REFERER} !^$ 
    RewriteCond %{HTTP_REFERER} !^http://(www.)?example.com/.*$ [NC] 
    RewriteRule .(gif|jpg|png)$ http://www.example.com/hotlinked.gif [R=301,L] 
    除了阻止图片盗链链接,以上规则将其盗链的图片全部替换成了你设置的图片。 你还可以阻止特定域名盗链你的图片: 
    RewriteCond %{HTTP_REFERER} !^http://(www.)?leech_site.com/ [NC] 
    RewriteRule .(gif|jpg|png)$ – [F,L] 
    这个规则将阻止域名黑名单上所有的图片链接请求。 
    当然以上这些规则都是以{HTTP_REFERER}获取域名为基础的,如果你想改用成IP地址,用{REMOTE_ADDR}就可以了。 
     
    5.如果文件不存在重定向到404页面 
    RewriteCond %{DOCUMENT_ROOT}%{REQUEST_FILENAME} !-f 
    RewriteCond %{DOCUMENT_ROOT}%{REQUEST_FILENAME} !-d 
    RewriteRule .? /404.php [L] 
    -f匹配的是存在的文件名,-d匹配的存在的路径名 

    6.创建无文件后缀名链接 
    RewriteCond %{REQUEST_FILENAME}.php -f 
    RewriteRule ^/?([a-zA-Z0-9]+)$ $1.php [L] 
    RewriteCond %{REQUEST_FILENAME}.html -f 
    RewriteRule ^/?([a-zA-Z0-9]+)$ $1.html [L] 
    如果文件是以.php为后缀,这条规则将被执行。 
     
    7. 强制使用HTTPS 
    RewriteCond %{HTTPS} !on 
    #RewriteCond %{SERVER_PORT} !^443$ 
    RewriteCond %{HTTP_HOST} ^([a-z.]+)?example.com$ [NC] 
    RewriteRule ^(.*)$  https://%1example.com$1 [R=301,L] 
    判断HTTPS服务可以判断安全端口(一般是443),也可以通过HTTPS变量。将example.com域名下所有url都强制使用https服务。 如果不判断域名,可以这样: 
    RewriteCond %{HTTPS} !on 
    RewriteRule ^/?(.*)$  https://%{SERVER_NAME}/$1 [R=301,L] 
    这里的$1前面有斜杠/,其实是匹配模式去掉了斜杠的原因,和上面效果是一样的。

    8.将.html后缀名转换成.php
    前提是.html文件能继续访问的情况下,更新你的网站链接。
    RewriteRule ^/?([a-z/]+).html$ $1.php [L]
    这不是一个网页重定向,所以访问者是不可见的。让他作为一个永久重定向(可见的),将FLAG修改[R=301,L]。

    9.检查查询变量里的特定参数
    如果在URL里面有一个特殊的参数,你可用RewriteCond鉴别其是否存在:
    RewriteCond %{QUERY_STRING} !uniquekey=
    RewriteRule ^/?script_that_requires_uniquekey.php$ other_script.php [QSA,L]
    以上规则将检查{QUERY_STRING}里面的uniquekey参数是否存在,如果{REQUEST_URI}值为script_that_requires_uniquekey,将会定向到新的URL。

    总结一些mod_rewrite和url匹配的技术细节 
    内部处理
    此模块的内部处理极为复杂,但是为了使一般用户避免犯低级错误,也让管理员能充分利用其功能,在此仍然做一下说明。

    API阶段
    首先,你必须了解Apache是分若干阶段来处理HTTP请求的。Apache API对每个阶段都提供了一个hook程序。mod_rewrite使用两个hook程序:
    其一,从URL到文件名的转换hook(用在读取HTTP请求之后、授权开始之前); 
    其二,修正hook(用在授权阶段和读取目录级配置(.htaccess)之后、内容处理器激活之前)。 

    所以,Apache收到一个请求并且确定了响应主机(或虚拟主机)之后,重写引擎即开始处理服务器级配置中的所有mod_rewrite指令(此时处于从URL到文件名转换的阶段),此阶段完成后,最终的数据目录便确定了。接下来进入修正程序段并触发目录级配置中的mod_rewrite指令。这两个阶段并不是泾渭分明的,但都实施了把URL重写成新的URL或者文件名。虽然API最初不是为此目的而设计的,但是现在它已经成为了API的一种用途。记住以下两点,会有助于更好地理解: 
    1). 虽然mod_rewrite可以将URL重写为新的URL或文件名,甚至将文件名重写为新的文件名,但是之前的API只提供从URL到文件名的hook。在Apache 2.0中,增加了两个丢失的hook以使得处理过程更加清晰。不过这样做并没有给用户带来麻烦,用户只需记住这样一个事实:借助从URL到文件名的 hook比最初API设计的目标功能更强大。

    2). 令人难以置信的是,mod_rewrite还提供了目录级的URL操作(.htaccess文件),而这些文件必须在将URL转换成文件名之后才会被处理(这是必须的,因为.htaccess存在于文件系统中)。换句话说,根据API阶段,这时再处理任何URL操作已经太晚了。为了解决这个"鸡和蛋"的问题,mod_rewrite使用了一个小技巧:在进行一个目录级的URL/文件名操作时,先把文件名重写回相应的URL(通常这个操作是不可行的,但是参考下面的RewriteBase指令就能明白它是怎么实现的了),然后,对这个新的URL建立一个新的内部的子请求,再重新开始API阶段的执行。 

    另外,mod_rewrite尽力使这些复杂的操作对用户透明。但仍须记住:服务器级的URL操作速度快而且效率高,而目录级的操作由于这个"鸡和蛋"的问题速度较慢而且效率也低。但从另一个侧面看,这却是mod_rewrite得以为一般用户提供(局部限制的)URL操作的唯一方法。 

    规则集的处理
    当mod_rewrite在这两个API阶段中开始执行时,它会读取配置结构中配置好的 (或者是在服务启动时建立的服务器级的,或者是在遍历目录采集到的目录级的)规则集,然后,启动URL重写引擎来处理(带有一个或多个条件的)规则集。无论是服务器级的还是目录级的规则集,都是由同一个URL重写引擎处理,只是最终结果处理不同而已。 

    规则集中规则的顺序是很重要的,因为重写引擎是按一种特殊的顺序处理的:逐个遍历每个规则(RewriteRule指令),如果出现一个匹配条件的规则,则可能回头遍历已有的规则条件(RewriteCond指令)。由于历史的原因,条件规则是前置的,所以控制流程略显冗长,细节见图-1。 


    图-1:重写规则集中的控制流 

    可见,URL首先与每个规则的Pattern匹配,如果匹配失败,mod_rewrite将立即终止此规则的处理,继而处理下一个规则。如果匹配成功,mod_rewrite将寻找相应的规则条件,如果一个条件都没有,则简单地用Substitution构造的新值来替换URL,然后继续处理其他规则;但是如果条件存在,则开始一个内部循环按其列出的顺序逐个处理。对规则条件的处理有所不同:URL并不与模式进行匹配,而是首先通过扩展变量、反向引用、查找映射表等步骤建立一个TestString字符串,然后用它来与CondPattern匹配。如果匹配失败,则整个条件集和对应的规则失败;如果匹配成功,则执行下一个规则直到所有条件执行完毕。如果所有条件得以匹配,则以Substitution替换URL,并且继续处理。 

    推荐资源
    Learn Apache mod_rewrite: 13 Real-world Examples,原文: 
    http://www.sitepoint.com/article/apache-mod_rewrite-examples/ 
    Learn Apache mod_rewrite: 13 Real-world Examples,译文:
    http://www.tsingfeng.com/?p=357 


    Apache的Mod_rewrite 例子: 

    http://dreamwaver.bokee.com/5692845.html

    目标 重写设置 说明
    规范化URL RewriteRule ^/~([^/]+)/?(.*) /u/$1/$2 [R] 将/~user重写为/u/user的形式
      RewriteRule ^/([uge])/([^/]+)$ /$1/$2/ [R] 将/u/user末尾漏掉的/补上
         
    规范化HostName RewriteCond %{HTTP_HOST} !^fully.qualified.domain.name [NC] 域名不合格
      RewriteCond %{HTTP_HOST} !^$ 不空
      RewriteCond %{SERVER_PORT} !^80$ 不是80端口
      RewriteRule ^/(.*) http://fully.qualified.domain.name:%{SERVER_PORT}/$1 [L,R] 重写
      RewriteCond %{HTTP_HOST} !^fully.qualified.domain.name [NC]  
      RewriteCond %{HTTP_HOST} !^$  
      RewriteRule ^/(.*) http://fully.qualified.domain.name/$1 [L,R]  
         
    URL根目录转移 RewriteEngine on  
      RewriteRule ^/$ /e/www/ [R] 从/移到/e/www/
         
    末尾目录补斜线 RewriteEngine on  
    (目录范围内) RewriteBase /~quux/  
      RewriteRule ^foo$ foo/ [R] /~quux/foo是一个目录,补/
         
      RewriteEngine on  
      RewriteBase /~quux/  
      RewriteCond %{REQUEST_FILENAME} -d 如果请文件名是个目录
      RewriteRule ^(.+[^/])$ $1/ [R] URL末尾不是斜线时补上
         
    Web集群 RewriteEngine on  
      RewriteMap user-to-host txt:/path/to/map.user-to-host 用户-服务器映射
      RewriteMap group-to-host txt:/path/to/map.group-to-host 组-服务器映射
      RewriteMap entity-to-host txt:/path/to/map.entity-to-host 实体-服务器映射
      RewriteRule ^/u/([^/]+)/?(.*) http://${user-to-host:$1|server0}/u/$1/$2 用户均衡
      RewriteRule ^/g/([^/]+)/?(.*) http://${group-to-host:$1|server0}/g/$1/$2 组均衡
      RewriteRule ^/e/([^/]+)/?(.*) http://${entity-to-host:$1|server0}/e/$1/$2 实体均衡
      RewriteRule ^/([uge])/([^/]+)/?$ /$1/$2/.www/  
      RewriteRule ^/([uge])/([^/]+)/([^.]+.+) /$1/$2/.www/$3  
         
    URL根目录搬迁 RewriteEngine on  
      RewriteRule ^/~(.+) http://newserver/~$1 [R,L] 到其它服务器
         
    所用户名首字母分 RewriteEngine on  
      RewriteRule ^/~(([a-z])[a-z0-9]+)(.*) /home/$2/$1/.www$3 内一层括号为$2
         
    NCSA imagemap移 RewriteEngine on  
    植为mod_imap RewriteRule ^/cgi-bin/imagemap(.*) $1 [PT]  
         
    多目录查找资源 RewriteEngine on  
      # first try to find it in custom/...  
      RewriteCond /your/docroot/dir1/%{REQUEST_FILENAME} -f  
      RewriteRule ^(.+) /your/docroot/dir1/$1 [L]  
      # second try to find it in pub/...  
      RewriteCond /your/docroot/dir2/%{REQUEST_FILENAME} -f  
      RewriteRule ^(.+) /your/docroot/dir2/$1 [L]  
      # else go on for other Alias or ScriptAlias directives,  
      RewriteRule ^(.+) - [PT]  
         
    据URL设置环境变量 RewriteEngine on  
      RewriteRule ^(.*)/S=([^/]+)/(.*) $1/$3 [E=STATUS:$2]  
         
    虚拟主机 RewriteEngine on  
      RewriteCond %{HTTP_HOST} ^www.[^.]+.host.com$ 基于用户名
      RewriteRule ^(.+) %{HTTP_HOST}$1 [C]  
      RewriteRule ^www.([^.]+).host.com(.*) /home/$1$2  
         
    内外人有别 RewriteEngine on  
      RewriteCond %{REMOTE_HOST} !^.+.ourdomain.com$ 基于远程主机
      RewriteRule ^(/~.+) http://www.somewhere.com/$1 [R,L]  
         
    错误重定向 RewriteEngine on  
      RewriteCond /your/docroot/%{REQUEST_FILENAME} !-f 不是regular文件
      RewriteRule ^(.+) http://webserverB.dom/$1  
         
    程序处理特殊协议 RewriteRule ^xredirect:(.+) /path/to/nph-xredirect.cgi/$1 Xredirect协议
      [T=application/x-httpd-cgi,L]  
         
    最近镜像下载 RewriteEngine on  
      RewriteMap multiplex txt:/path/to/map.cxan 顶级域名与最近ftp服务器映射
      RewriteRule ^/CxAN/(.*) %{REMOTE_HOST}::$1 [C]  
      RewriteRule ^.+.([a-zA-Z]+)::(.*)$ ${multiplex:$1|ftp.default.dom}$2 [R,L] 据顶级域名不同提供不同的FTP服务器
         
    基于时间重写 RewriteEngine on  
      RewriteCond %{TIME_HOUR}%{TIME_MIN} >0700  
      RewriteCond %{TIME_HOUR}%{TIME_MIN} <1900  
      RewriteRule ^foo.html$ foo.day.html 白天为早晚7点间
      RewriteRule ^foo.html$ foo.night.html 其余为夜间
         
    向前兼容扩展名 RewriteEngine on  
      RewriteBase /~quux/  
      # parse out basename, but remember the fact  
      RewriteRule ^(.*).html$ $1 [C,E=WasHTML:yes]  
      # rewrite to document.phtml if exists  
      RewriteCond %{REQUEST_FILENAME}.phtml -f 如果存在$1.phtml则重写
      RewriteRule ^(.*)$ $1.phtml [S=1]  
      # else reverse the previous basename cutout  
      RewriteCond %{ENV:WasHTML} ^yes$ 如果不存在$1.phtml,则保持不变
      RewriteRule ^(.*)$ $1.html  
         
    文件改名(目录级) RewriteEngine on 内部重写
      RewriteBase /~quux/  
      RewriteRule ^foo.html$ bar.html  
         
      RewriteEngine on 重定向由客户端再次提交
      RewriteBase /~quux/  
      RewriteRule ^foo.html$ bar.html [R]  
         
    据浏览器类型重写 RewriteCond %{HTTP_USER_AGENT} ^Mozilla/3.*  
      RewriteRule ^foo.html$ foo.NS.html [L]  
      RewriteCond %{HTTP_USER_AGENT} ^Lynx/.* [OR]  
      RewriteCond %{HTTP_USER_AGENT} ^Mozilla/[12].*  
      RewriteRule ^foo.html$ foo.20.html [L]  
      RewriteRule ^foo.html$ foo.32.html [L]  
         
    动态镜像远程资源 RewriteEngine on  
      RewriteBase /~quux/  
      RewriteRule ^hotsheet/(.*)$ http://www.tstimpreso.com/hotsheet/$1 [P] 利用了代理模块
         
      RewriteEngine on  
      RewriteBase /~quux/  
      RewriteRule ^usa-news.html$ http://www.quux-corp.com/news/index.html [P]  
         
    反向动态镜像 RewriteEngine on  
      RewriteCond /mirror/of/remotesite/$1 -U  
      RewriteRule ^http://www.remotesite.com/(.*)$ /mirror/of/remotesite/$1  
         
    负载均衡 RewriteEngine on 利用代理实现round-robin效果
      RewriteMap lb prg:/path/to/lb.pl  
      RewriteRule ^/(.+)$ ${lb:$1} [P,L]  
         
      #!/path/to/perl  
      $| = 1;  
      $name = "www"; # the hostname base  
      $first = 1; # the first server (not 0 here, because 0 is myself)  
      $last = 5; # the last server in the round-robin  
      $domain = "foo.dom"; # the domainname  
      $cnt = 0;  
      while (<STDIN>) {  
      $cnt = (($cnt+1) % ($last+1-$first));  
      $server = sprintf("%s%d.%s", $name, $cnt+$first, $domain);  
      print "http://$server/$_";  
      }  
      ##EOF##  
         
    静态页面变脚本 RewriteEngine on  
      RewriteBase /~quux/  
      RewriteRule ^foo.html$ foo.cgi [T=application/x-httpd-cgi]  
         
    阻击机器人 RewriteCond %{HTTP_USER_AGENT} ^NameOfBadRobot.*  
      RewriteCond %{REMOTE_ADDR} ^123.45.67.[8-9]$  
      RewriteRule ^/~quux/foo/arc/.+ - [F]  
         
    阻止盗连你的图片 RewriteCond %{HTTP_REFERER} !^$  
      RewriteCond %{HTTP_REFERER} !^http://www.quux-corp.de/~quux/.*$ [NC] 自己的连接可不能被阻止
      RewriteRule .*.gif$ - [F]  
         
      RewriteCond %{HTTP_REFERER} !^$  
      RewriteCond %{HTTP_REFERER} !.*/foo-with-gif.html$  
      RewriteRule ^inlined-in-foo.gif$ - [F]  
         
    拒绝某些主机访问 RewriteEngine on  
      RewriteMap hosts-deny txt:/path/to/hosts.deny  
      RewriteCond ${hosts-deny:%{REMOTE_HOST}|NOT-FOUND} !=NOT-FOUND [OR]  
      RewriteCond ${hosts-deny:%{REMOTE_ADDR}|NOT-FOUND} !=NOT-FOUND  
      RewriteRule ^/.* - [F]  
         
    用户授权 RewriteCond %{REMOTE_IDENT}@%{REMOTE_HOST} !^friend1@client1.quux-corp.com$  
      RewriteCond %{REMOTE_IDENT}@%{REMOTE_HOST} !^friend2@client2.quux-corp.com$  
      RewriteCond %{REMOTE_IDENT}@%{REMOTE_HOST} !^friend3@client3.quux-corp.com$  
      RewriteRule ^/~quux/only-for-friends/ - [F]  
         
    外部重写程序模板 RewriteEngine on  
      RewriteMap quux-map prg:/path/to/map.quux.pl  
      RewriteRule ^/~quux/(.*)$ /~quux/${quux-map:$1}  
         
      #!/path/to/perl  
      $| = 1;  
      while (<>) {  
      s|^foo/|bar/|;  
      print $_;  
      }  
         
    搜索引擎友好 RewriteRule ^/products$ /content.php  
      RewriteRule ^/products/([0-9]+)$ /content.php?id=$1  
      RewriteRule ^/products/([0-9]+),([ad]*),([0-9]{0,3}),([0-9]*),([0-9]*$) /marso/content.php?id=$1&sort=$2&order=$3&start=$4

  • 相关阅读:
    一个怂女婿的成长笔记【十八】
    一个怂女婿的成长笔记【十七】
    一个怂女婿的成长笔记【十六】
    一个怂女婿的成长笔记【十五】
    一个怂女婿的成长笔记【十四】
    一个怂女婿的成长笔记【十三】
    一个怂女婿的成长笔记【十二】
    一个怂女婿的成长笔记【十一】
    jmeter中“csv data set config ”函数的使用
    jmater中“_CSVRead”函数的使用
  • 原文地址:https://www.cnblogs.com/geeek/p/4778595.html
Copyright © 2020-2023  润新知