Apache Mod_rewrite的一份资料

自己的破服务器上装的是Linux AS4 + Apache1.3 + PHP5.2,这两天为了玩个东西,发现竟然Mod_rewrite没有开启,想来这不成啊,少了这好功能,便有不少东西玩不了了。

于是赶紧把Mod_rewrite打开来,在此,也转一篇比较经典比较详细的关于Mod_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 (<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

转载:http://hedong.3322.org/archives/000349.html

参考文献:
URL Rewriting Guide
http://httpd.apache.org/docs/misc/rewriteguide.html

mod_rewrite: A Beginner's Guide to URL Rewriting
http://www.sitepoint.com/article/910

再推荐一个中文的手册:http://www.kreny.com/docs/apache2.0/mod/mod_rewrite.html

我有三言两语要评论:

如果需要您输入验证码,而您又看不清楚时,请点击发言区域右上角的“匿名式发表”以刷新验证码
Ethan Jiang

人不能没有一种对某种不可摧毁的东西保持持久信念的生活……

Gmail

MSN QQ

吃吃喝喝是因那贪得无厌;说说灌灌只为了笑逐颜开。

October 2008
      1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31  

Recent Entry
Ethan Jiang 尚能饭焉
Live Traffic Feed
45eggs Blog Feed