Apache的mod_rewrite是提供了强大URL操作的杀手级的模块,可以实现几乎所有你梦想的URL操作类型,其代价是你必须接受其复杂性,因 为mod_rewrite的主要障碍就是初学者不容易理解和运用,即使是Apache专家有时也会发掘出mod_rewrite的新用途。
换句话说:对mod_rewrite,或者是打退堂鼓永不再用,或者是喜欢它并一生受用。
ReWrite可以应用在以下方面或者解决以下问题:
URL的规划
规范的URL
说明:
在有些网站服务器上,一个资源会拥有多个URL,在实际应用和发布中应该被使用的是规范的URL,其他的则是简写或者是内部使用的。无论用户在请求中使用什么形式的URL,他最终看见的都应该是规范的URL。
说明:
在有些网站服务器上,一个资源会拥有多个URL,在实际应用和发布中应该被使用的是规范的URL,其他的则是简写或者是内部使用的。无论用户在请求中使用什么形式的URL,他最终看见的都应该是规范的URL。
方案:
对所有的不规范的URL执行一个外部的HTTP重定向,以改变它在浏览器地址栏中的显示及其后继的请求。下例中的规则集用规范的/u/user替换/~user,并修正了/u/user所遗漏的后缀的斜杠。
代码:
RewriteRule ^/~([^/]+)/?(.*) /u/$1/$2 [R]
RewriteRule ^/([uge])/([^/]+)$ /$1/$2/ [R]
规范的主机名
说明:
...
方案:
代码:
RewriteCond % !^fully.qualified.domain.name [NC]
RewriteCond % !^$
RewriteCond % !^80$
RewriteRule ^/(.*) http://fully.qualified.domain.name:%/$1 [L,R]
RewriteCond % !^fully.qualified.domain.name [NC]
RewriteCond % !^$
RewriteRule ^/(.*) http://fully.qualified.domain.name/$1 [L,R]
被移动过的DocumentRoot
说明:
通常,网站服务器的DocumentRoot 直接对应于URL"/",但是,它常常不是处于最高一级,而可能只是众多数据池中的一个实体。比如,在Intranet站点中,有/e/www/(WWW 的主页)、/e/sww/ (Intranet的主页)等等,而DocumentRoot指向了/e/www/,则必须保证此数据池中的所有内嵌的图片和其他元素对后继请求有效。
方案:
只须重定向URL /到/e/www/即可。这个方案看起来很简单,但只是有了mod_rewrite模块的支持,它才简单,因为传统的URL Aliases机制(由mod_alias及其相关模块提供)只是作了一个前缀匹配,DocumentRoot是一个对所有URL的前缀,因而无法实现这 样的重定向。而用mod_rewrite的确很简单:
代码:
RewriteEngine on
RewriteRule ^/$ /e/www/ [R]
后缀斜杠的问题
说明:
每个网管对引用目录后缀斜杠的问题都有一本苦经,如果遗漏了,服务器会产生一个错误,因为如果请求是/~quux/foo而不是/~quux/foo/,服务器会去找一个叫foo的文件,而它是一个目录,所以就报错了。事实上,大多数情况下,它自己会试图修正这个错误,但是有时候需要你手工纠正,比如,在重写了许多CGI脚本中的复杂的URL以后。
方案:
解决这个微妙问题的方案是让服务器自 动添加后缀的斜杠。对此,必须使用一个外部的重定向,使浏览器正确地处理后继的对诸如图片的请求。如果仅仅作一个内部的重写,可能只对目录页面有效,而对 内嵌有使用相对URL的图片的页面则无效,因为浏览器有请求内嵌目标的可能。比如,如果不用外部重定向,/~quux/foo/index.html页面 中对image.gif的请求,其结果将是/~quux/image.gif!。
所以,应该这样写:
代码:
RewriteEngine on
RewriteBase /~quux/
RewriteRule ^foo$ foo/ [R]
又懒又疯狂的做法是把这些写入其宿主目录中的顶级.htaccess中,但是须注意,如此会带来一些处理上的开销。
代码:
RewriteEngine on
RewriteBase /~quux/
RewriteCond % -d
RewriteRule ^(.+[^/])$ $1/ [R]
集群网站的同类URL规划
说明:
我们希望在一个Intranet集群网站中,对所有WWW服务器建立一个同类的一致性的URL规划,也就是,所有的URL(对单个服务器来说,是本地的依赖于此服务器的!)是独立于服务器的!我们需要的是一个具有独立于服务器的一致性规划的WWW名称空间,即,URL不需要包含正确的物理的目标服务器,而由集群本身来自动定位物理的目标主机。
方案:
首先,目标服务器的信息来自(产生)于包含有用户、组以及实体的外部地图,其格式形如:
代码:
user1 server_of_user1
user2 server_of_user2
: :
这些信息被存入map.xxx-to-host文件。其次,如果URL在一个服务器上无效,需要引导所有的服务器重定向URL
代码:
/u/user/anypath
/g/group/anypath
/e/entity/anypath
到
代码:
http://physical-host/u/user/anypath
http://physical-host/g/group/anypath
http://physical-host/e/entity/anypath
以下规则集依靠地图文件来完成这个操作(假定,如果一个用户在地图中没有对应的项,则使用server0为默认服务器):
代码:
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://$/u/$1/$2
RewriteRule ^/g/([^/]+)/?(.*) http://$/g/$1/$2
RewriteRule ^/e/([^/]+)/?(.*) http://$/e/$1/$2
RewriteRule ^/([uge])/([^/]+)/?$ /$1/$2/.www/
RewriteRule ^/([uge])/([^/]+)/([^.]+.+) /$1/$2/.www/$3
移动宿主目录到不同的网站服务器
说明:
通常,许多网管在建立一个新的网站服务器时,都会有这样的要求:重定向一个网站服务器上的所有宿主目录到另一个网站服务器。
方案:
很简单,用mod_rewrite。在老的网站服务器上重定向所有的URL /~user/anypath到http://newserver/~user/anypath。
代码:
RewriteEngine on
RewriteRule ^/~(.+) http://newserver/~$1 [R,L]
结构化的宿主目录
说明:
一些拥有几千个用户的网站通 常都使用结构化的宿主目录规划,即,每个宿主目录位于一个带有特定前缀比如其用户名的第一个字符的子目录下。那么,/~foo/anypath代表 /home/f/foo/.www/anypath,而/~bar/anypath代表/home/b/bar/.www/anypath。
方案:
可以使用下列规则集来扩展~以达到上述目的。
代码:
RewriteEngine on
RewriteRule ^/~(([a-z])[a-z0-9]+)(.*) /home/$2/$1/.www$3
文件系统的重组
说明:
这 是一个不加雕琢的例子:一个大量使用针对目录的规则集以实现平滑观感,而从来不用调整数据结构的杀手级的应用。背景:net.sw从1992年开始,存放 了我收集的免费的有效的Unix软件包。它是我的爱好也是我的工作,因为在学习计算机科学的同时,业余时间还做了多年的系统和网络的管理员。每周我都需要 整理软件,因而建立了一个层次很深的目录结构来存放各种软件包:
代码:
drwxrwxr-x 2 netsw users 512 Aug 3 18:39 Audio/
drwxrwxr-x 2 netsw users 512 Jul 9 14:37 Benchmark/
drwxrwxr-x 12 netsw users 512 Jul 9 00:34 Crypto/
drwxrwxr-x 5 netsw users 512 Jul 9 00:41 Database/
drwxrwxr-x 4 netsw users 512 Jul 30 19:25 Dicts/
drwxrwxr-x 10 netsw users 512 Jul 9 01:54 Graphic/
drwxrwxr-x 5 netsw users 512 Jul 9 01:58 Hackers/
drwxrwxr-x 8 netsw users 512 Jul 9 03:19 InfoSys/
drwxrwxr-x 3 netsw users 512 Jul 9 03:21 Math/
drwxrwxr-x 3 netsw users 512 Jul 9 03:24 Misc/
drwxrwxr-x 9 netsw users 512 Aug 1 16:33 Network/
drwxrwxr-x 2 netsw users 512 Jul 9 05:53 Office/
drwxrwxr-x 7 netsw users 512 Jul 9 09:24 SoftEng/
drwxrwxr-x 7 netsw users 512 Jul 9 12:17 System/
drwxrwxr-x 12 netsw users 512 Aug 3 20:15 Typesetting/
drwxrwxr-x 10 netsw users 512 Jul 9 14:08 X11/
1996 年7月,我决定通过一个漂亮的Web接口公开我的收藏。“漂亮”是指提供一个接口以直接浏览整个目录结构,同时不对这个结构做任何改变 - 甚至也不在结构顶部放置CGI脚本。为什么呢?因为这个结构还要能够被FTP访问,而且我不希望其中有任何Web或者CGI的成分。
方案:
这个方案分为两个部分:第一个部分,是用于在空闲时间建立所有目录页面的CGI脚本集。我把它们放在/e/netsw/.www/,如下:
代码:
-rw-r--r-- 1 netsw users 1318 Aug 1 18:10 .wwwacl
drwxr-xr-x 18 netsw users 512 Aug 5 15:51 DATA/
-rw-rw-rw- 1 netsw users 372982 Aug 5 16:35 LOGFILE
-rw-r--r-- 1 netsw users 659 Aug 4 09:27 TODO
-rw-r--r-- 1 netsw users 5697 Aug 1 18:01 netsw-about.html
-rwxr-xr-x 1 netsw users 579 Aug 2 10:33 netsw-access.pl
-rwxr-xr-x 1 netsw users 1532 Aug 1 17:35 netsw-changes.cgi
-rwxr-xr-x 1 netsw users 2866 Aug 5 14:49 netsw-home.cgi
drwxr-xr-x 2 netsw users 512 Jul 8 23:47 netsw-img/
-rwxr-xr-x 1 netsw users 24050 Aug 5 15:49 netsw-lsdir.cgi
-rwxr-xr-x 1 netsw users 1589 Aug 3 18:43 netsw-search.cgi
-rwxr-xr-x 1 netsw users 1885 Aug 1 17:41 netsw-tree.cgi
-rw-r--r-- 1 netsw users 234 Jul 30 16:35 netsw-unlimit.lst
其 中的DATA/子目录包含了上述目录结构,即实在的net.sw,由rdist在需要的时候自动更新。第二个部分的遗留问题是:如何连接这两个结构为一个 平滑观感的URL树?我希望在运行适当的CGI脚本而使用各种URL的时候,使用户感觉不到DATA/目录的存在。方案如下:首先,我把下列配置放在服务器上DocumentRoot中的针对目录的配置文件里,以重写公布的URL /net.sw/ 为内部路径 /e/netsw:
代码:
RewriteRule ^net.sw$ net.sw/ [R]
RewriteRule ^net.sw/(.*)$ e/netsw/$1
第一条规则是针对遗漏后缀斜杠的请求的!第二条规则才是真正实现功能的。接着,就是放在针对目录的配置文件/e/netsw/.www/.wwwacl中的杀手级的配置了:
代码:
Options ExecCGI FollowSymLinks Includes MultiViews
RewriteEngine on
# we are reached via /net.sw/ prefix
RewriteBase /net.sw/
# first we rewrite the root dir to
# the handling cgi script
RewriteRule ^$ netsw-home.cgi [L]
RewriteRule ^index.html$ netsw-home.cgi [L]
# strip out the subdirs when
# the browser requests us from perdir pages
RewriteRule ^.+/(netsw-[^/]+/.+)$ $1 [L]
# and now break the rewriting for local files
RewriteRule ^netsw-home.cgi.* - [L]
RewriteRule ^netsw-changes.cgi.* - [L]
RewriteRule ^netsw-search.cgi.* - [L]
RewriteRule ^netsw-tree.cgi$ - [L]
RewriteRule ^netsw-about.html$ - [L]
RewriteRule ^netsw-img/.*$ - [L]
# anything else is a subdir which gets handled
# by another cgi script
RewriteRule !^netsw-lsdir.cgi.* - [C]
RewriteRule (.*) netsw-lsdir.cgi/$1
阅读提示:
注意前半部分中的标志L(最后),和无对应项('-')
注意后半部分中的符号!(非),和标志C (链)
注意最后一条规则的全匹配模式
代码:
NCSA imagemap和Apache mod_imap
说明:
许多人都希望在从NCSA网站服务器向较现代的Apache网站服务器转 移中实现平滑过渡,即希望老的NCSA imagemap程序能在Apache的较现代的mod_imap支持下正常运作。但问题在于,到处都是通过/cgi- bin/imagemap/path/to/page.map引用imagemap程序的连接,而在Apache下,应该写成 /path/to/page.map。
方案:
使用全局规则在空闲时间去除所有这些请求的前缀:
代码:
RewriteEngine on
RewriteRule ^/cgi-bin/imagemap(.*) $1 [PT]
在多个目录中搜索页面
说明:
有时会有必要使网站服务器在多个目录中搜索页面,对此,MultiViews或者其他技术无能为力。
方案:
编制一个明确的规则集以搜索目录中的文件。
代码:
RewriteEngine on
# first try to find it in custom/...
# ...and if found stop and be happy:
RewriteCond /your/docroot/dir1/% -f
RewriteRule ^(.+) /your/docroot/dir1/$1 [L]
# second try to find it in pub/...
# ...and if found stop and be happy:
RewriteCond /your/docroot/dir2/% -f
RewriteRule ^(.+) /your/docroot/dir2/$1 [L]
# else go on for other Alias or ScriptAlias directives,
# etc.
RewriteRule ^(.+) - [PT]
按照URL的片段设置环境变量
说明:
如果希望保持请求之间的状态信息,但又不希望使用CGI来包装所有页面,而只通过分离URL中的有用信息来编码。
方案:
可以用一个规则集来分离出状态信息,并设置环境变量以备此后用于XSSI或CGI。如此,一个/foo/S=java/bar/的URL会被解析为/foo/bar/,而环境变量STATUS则被设置为"java"。
代码:
RewriteEngine on
RewriteRule ^(.*)/S=([^/]+)/(.*) $1/$3 [E=STATUS:$2]
虚拟用户主机
说明:
如果需要为用户username支持一个[url]www.username.host.domain.com[/url]的主页,但不是用在此机器上建虚拟主机的方法,而是用仅在此机器上增加一个DNS记录的方法实现。
方案:
对HTTP/1.0 的请求,这是无法实现的;但是对HTTP/1.1的在HTTP头中包含有主机名的请求,可以用以下规则集来内部地重写[url]http: //www.username.host.com/anypath[/url]为/home/username/anypath:
代码:
RewriteEngine on
RewriteCond % ^www.[^.]+.host.com$
RewriteRule ^(.+) %$1 [C]
RewriteRule ^[url]www.([/url][^.]+).host.com(.*) /home/$1$2
为外来访问者重定向宿主目录
说明:
对不是来自本地域ourdomain.com的外来访问者的请求,重定向其宿主目录URL到另一个网站服务器[url]www.somewhere.com[/url],有时这种做法也会用在虚拟主机的上下文中。
方案:
只须一个重写条件:
代码:
RewriteEngine on
RewriteCond % !^.+.ourdomain.com$
RewriteRule ^(/~.+) [url]http://www.somewhere.com/$1[/url] [R,L]
分享到:
相关推荐
为了让客户不会因此受到任何影响,最好的方法就是使用Apache Rewrite Rule(重写规则)。 二、重写规则的作用范围 —- 1.使用在Apache主配置文件httpd.conf中。 —- 2.使用在httpd.conf里定义的配置中。 ...
### Apache URL Rewrite功能配置知识点详解 #### 一、Apache URL Rewrite简介 Apache URL Rewrite功能是Apache Web服务器的一个强大工具,它允许用户通过一系列规则来改变客户端请求的URL,从而实现URL重写、...
Apache的mod_rewrite模块是Web服务器中的一个强大工具,它允许我们通过定义规则来重写URL,从而实现诸如URL美化、隐藏真实路径、实现重定向等多种功能。以下是对Apache rewrite重写参数及其用法的详细说明: 1. **R...
### Apache mod_rewrite模块使用教程 #### 一、引言 Apache服务器是一款广泛使用的Web服务器软件,支持多种操作系统,包括Windows和Linux。为了更好地管理和优化网站的URL结构,Apache提供了强大的`mod_rewrite`...
Apache的Mode Rewrite模块和.htaccess文件配合 Apache的Mode Rewrite模块和.htaccess文件配合是Apache服务器中两个非常重要的组件,特别是在网站开发和部署中。下面我们将详细介绍这两个组件的概念、配置方法和应用...
启用Apache的Rewrite功能是一项重要的配置工作,它允许你通过修改URL(重写规则)来进行URL美化、隐藏真实路径或者实现其他高级路由逻辑。下面将详细介绍如何在Ubuntu下启动Apache的Rewrite功能。 首先,Apache的...
Apache HTTP Server 是一款广泛应用的开源Web服务器,支持各种功能扩展,包括URL重写。URL重写功能主要由mod_rewrite模块提供,它允许管理员通过配置文件(httpd.conf)中的规则来改变请求的URL,实现动态URL到静态...
Apache Rewrite 是Apache HTTP Server中的一个模块,它提供了URL重写功能,能够对用户请求的URL进行转换,以便实现各种高级的网站路由和管理策略。这个功能主要基于Perl语言的正则表达式规则,使得我们可以灵活地...
Apache HTTP Server 是一款开源的Web服务器软件,广泛应用于各种Linux系统中。在Linux环境下配置Apache服务器,特别是涉及到URL重写功能时,通常需要使用mod_rewrite模块。这个模块允许我们通过定义规则来转换URL,...
Apache的Rewrite模块和拟静态配置是Web开发中不可或缺的技术,它们可以帮助我们实现URL的美化,使网站看起来更加专业,同时也对SEO(搜索引擎优化)有着积极的影响。 Apache是世界上最流行的开源Web服务器软件,而...
在PHP开发中,经常需要检测Apache服务器是否已经安装并启用了mod_rewrite模块,以便正确配置应用程序。 本文将介绍如何使用PHP编写函数来检查Apache的mod_rewrite模块是否已安装。这个函数名为`isRewriteMod()`,由...
Apache HTTP Server是一款广泛应用的开源Web服务器,而`mod_rewrite`是Apache的一个模块,它提供了URL重写功能,常用于优化网站的URL结构、实现动态URL的静态化,以及进行URL的路由控制等。在`win32`平台上,Apache ...
《Apache mod_rewrite 权威指南》是一本由 Rich Bowen 编写的专业书籍,于2006年2月出版,该书系统地介绍了 Apache 的 mod_rewrite 模块,这是一个用于 URL 重写的重要工具,广泛应用于网站管理和优化、SEO 以及网站...
`mod_rewrite` 是 Apache 服务器的一个功能强大的 URL 重写模块,它可以用于 URL 重写、重定向、URL 规范化等。通过对 URL 的各种转换操作,`mod_rewrite` 能够帮助我们实现复杂的重定向逻辑,例如将所有 HTTP 请求...
本教程将深入探讨Apache2.2的应用及其配置。 1. **安装与启动** - 安装Apache2.2通常涉及下载源码或使用操作系统提供的包管理器(如在Ubuntu上使用`apt-get install apache2`)。 - 启动Apache服务器,可以运行`...
下面我们将深入探讨Apache的Rewrite规则及其在实际操作中的应用。 首先,确保Apache服务器已经安装了mod_rewrite模块。如果未安装,可以在编译Apache时添加`--enable-mods-shared=all --enable-rewrite`选项,或者...
以下是对标题和描述中提到的13个实用的Apache Rewrite重写规则的详细解释: 1. **去除www前缀**:这个规则用于将URL中的 "www" 前缀去掉,统一域名格式。当HTTP_HOST不等于 `jb51.net` 时,规则将URL重定向至无 ...
例如,当Nginx接收到一个特定的URL请求时,它可以将这个请求传递给内部的Web服务器(如Apache、Tomcat或Node.js服务)进行处理。`proxy_pass`的基本语法是: ``` proxy_pass http://upstream_name; ``` 其中,`...