Apache的Mod_rewrite学习

主要包括了在rewrite中使用的几个正则的说明
目标 重写设置 说明
规范化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 () {
$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} !^[email protected] $
RewriteCond %{REMOTE_IDENT}@%{REMOTE_HOST} !^[email protected] $
RewriteCond %{REMOTE_IDENT}@%{REMOTE_HOST} !^[email protected] $
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ℴ= $3&start= $4

Published At
Categories with 服务器类
Tagged with
comments powered by Disqus