Apache的mod_rewrite是一个杀手级模块,提供强大的URL操作,几乎可以实现你梦想的所有URL操作类型。代价是你要接受它的复杂性,因为作为mod_rewrite的主要障碍是初学者不容易理解和使用。甚至Apache专家有时也会发现mod_rewrite的新用途。
换句话说:对于mod_rewrite,要么退让,再也不用,要么喜欢,终身享受。
重写可以用在以下几个方面或者解决以下几个问题:URL规划的URL规范:在一些网站服务器上,一个资源会有多个URL,在实际应用和发布中要使用标准化的URL,其他的则是缩写或者内部使用。无论用户在请求中使用什么形式的URL,最终看到的都应该是标准化的URL。
方案:对所有非标准URL执行外部HTTP重定向,改变它们在浏览器地址栏的显示及其后续请求。以下示例中的规则集将/~user替换为标准的/u/user,并更正了/u/user遗漏的后缀斜杠。
代码:rewriterule/~ ([/])/?(.*) /u/$1/$2 [R]重写者^/([uge])/([^/] )$ /$1/$2/[R]
被移动的DocumentRoot的描述:通常一个网站服务器的DocumentRoot直接对应URL'/'但它往往不在最高层,而可能只是很多数据池中的一个实体。例如,在一个内部网站点中,有/e/www/(www的主页)、/e/sww/(内部网的主页)等。而DocumentRoot指向/e/www/,所以需要确保这个数据池中所有嵌入的图片和其他元素对后续的请求都是有效的。
方案:只需将URL/重定向到/e/www/。这个方案看起来很简单,但是只有在mod_rewrite模块的支持下才简单,因为传统的URL别名机制(由mod_alias及其相关模块提供)只做一个前缀匹配,而DocumentRoot是所有URL的前缀,所以无法实现这样的重定向。使用mod_rewrite非常简单:
代码:重写规则上的重写引擎/$/e/www/[r]
后缀问题的解释:每个网络管理员都有一本关于引用目录后缀斜杠问题的苦书。如果省略,服务器会产生错误,因为如果请求是/~quux/foo而不是/~quux/foo/,服务器会找到一个叫foo的文件,而且是目录,所以会报错。事实上,在大多数情况下,它会尝试自己纠正这个错误,但有时你需要手动纠正,例如,在许多CGI脚本中重写复杂的URL后。
解决方案:这个微妙问题的解决方案是让服务器自动添加一个带后缀的斜杠。因此,必须使用外部重定向,以便浏览器能够正确处理后续请求,如图片。如果只进行内部重写,它可能只对目录页面有效,但对使用相对URL嵌入图像的页面无效,因为浏览器有能力请求嵌入的目标。例如,如果不使用外部重定向,那么/~quux/foo/index.html页面中对image.gif的请求将产生/~quux/image.gif!
所以,应该这样写:
代码:重写基础上的重写引擎/~ quux/重写规则foo $ foo/[r]
把这些写进顶层,是懒惰,也是疯狂。htaccess放在它的主机目录下,但是需要注意的是这样会带来一些处理开销。
代码:重写基础上的重写引擎/~ quux/rewrite%-d重写规则(。[/]) $ $1/[r]
集群网站相似URL规划描述:我们希望为一个内网集群网站中的所有WWW服务器建立一个相似的、一致的URL规划,即所有URL(对于单个服务器,它们是本地的,依赖于这个服务器!)是独立于服务器的!我们需要的是一个与服务器无关的一致性规划的WWW命名空间,即URL不需要包含正确的物理目标服务器,但是集群本身可以自动定位物理目标主机。
方案:首先,目标服务器的信息来自(生成自)包含用户、组和实体的外部地图,其格式如下:
代码:user 1 server _ of _ user 1 user 2 server _ of _ user 2:
该信息存储在map.xxx-to-host文件中。其次,如果URL在一台服务器上无效,需要引导所有服务器重定向URL。
code:/u/user/any path/g/group/any path/e/entity/any path
^/([uge])/([^/]/?$ /$1/$2/.^/([uge])/([^/] )/([^.] .) /$1/$2/.www/$3\
将主机目录移动到不同的网站服务器描述:通常,当许多网络管理员建立新的网站服务器时,他们需要将一个网站服务器上的所有主机目录重定向到另一个网站服务器。
结构化托管目录的描述:一些拥有数千用户的网站通常会使用结构化托管目录规划,即每个托管目录都位于一个带有特定前缀的副标题中,比如其用户名的第一个字符。然后,/~foo/anypath代表/home/f/foo/。www/anypath,而/~bar/anypath代表/home/b/bar/。www/anypath。
Scheme:下面的规则集可以用来扩展~来达到上述目的。
代码:重写规则上的重写引擎/~ (([A-Z]) [A-Z0-9])(。*)/home/$2/$1/。www3
对系统重组的描述:这是一个不加修饰的例子:一个杀手级应用程序,它使用大量的目录规则集来实现流畅的外观和感觉,并且永远不必调整数据结构。背景:从1992年开始,net.sw就存储了我收集的免费有效的Unix软件包。这是我的爱好,也是我的工作,因为在学习计算机科学的同时,我在业余时间做了多年的系统和网络管理员。我每周都需要整理软件,所以我设置了一个深度目录结构来存放各种软件包:
代码:drwxrwxr-x2netsw用户512 aug 3 18:39 audio/drwxrwxr-x2 netsw用户512 July 9 14:37 benchmark/drwxrwxr-x 12 netsw用户512 July 9 00:34 Crypto/drwxrwxr-x 5 netsw用户512 July 9 00:41 Database/drwxrwxr-x 4 netsw用户512 July 30 19:25 Dicts/drwxrwxr-x 3网络软件用户512 7月9日03:24 Misc/drwxrwxr-x 9网络软件用户512 8月1日16:33网络/drwxrwxr-x 2网络软件用户512 7月9日05:53办公室/drwxrwxr-x 7网络软件用户512 7月9日09:24软件/drwxrwxr-x 7网络软件用户512 7月9日12:17系统/dr
1996年7月,我决定通过一个漂亮的网络界面公开我的收藏。ldquoRdquo它指的是提供一个直接浏览整个目录结构的界面,而不需要对结构做任何改变——甚至不需要将CGI脚本放在结构的顶部。为什么?因为这个结构可以通过FTP访问,而且我不希望里面有任何Web或者CGI的组件。
方案:该方案分为两部分:第一部分是CGI脚本集,用于在空闲时间构建所有目录页面。我把它们放在/e/netsw/中。www/,如下所示:
代码:-RW-R-R-1NetSW用户1318AUG1 18: 10。WWWACL DRWXR-XR-X18NetSW用户512AUG5 15: 51 Data/-RW-RW-1NetSW用户