Chinaunix首页 | 论坛 | 博客
  • 博客访问: 2566599
  • 博文数量: 709
  • 博客积分: 12251
  • 博客等级: 上将
  • 技术积分: 7905
  • 用 户 组: 普通用户
  • 注册时间: 2005-07-17 00:00
个人简介

实现有价值的IT服务

文章存档

2012年(7)

2011年(147)

2009年(3)

2008年(5)

2007年(74)

2006年(431)

2005年(42)

分类: 系统运维

2006-02-08 10:26:06

Apache 2.0 中文文档

URL到文件系统的映射

2004-02-11 Apache 译者:kajaa 
 
相关模块和指令

相关模块
mod_alias
mod_proxy
mod_rewrite
mod_userdir
mod_speling
mod_vhost_alias

相关指令
Alias
AliasMatch
CheckSpelling
DocumentRoot
ErrorDocument
Options
ProxyPass
ProxyPassReverse
Redirect
RedirectMatch
RewriteCond
RewriteMatch
ScriptAlias
ScriptAliasMatch
UserDir

DocumentRoot
Apache根据请求定位文件的默认操作是,取出URL路径(即,URL中的主机名和端口部分)附加到由DocumentRoot 指定的文件系统路径后面,组成在网上所看见的文件树结构。

如果服务器由多个 虚拟主机,则Apache会用各虚拟主机自己的 DocumentRoot 来组成文件系统路径;还可能根据由 mod_vhost_alias提供的指令动态地针对所请求的地址或端口定位文件。

DocumentRoot以外的文件

实际应用中,经常有必要允许网络对 DocumentRoot以外的文件进行访问。对此,Apache提供了多种方法,在Unix系统中,可以在文件系统的DocumentRoot目录下安置符号连接以访问其外部文件,考虑到安全问题,这种方法仅在相应目录的 Options 中设置了FollowSymLinks或SymLinksIfOwnerMatch时才有效。

另一种方法是,使用Alias指令可以映射文件系统的任何部分到网络空间中。例如,这个命令

Alias /docs /var/web

可以把 URL 映射为 /var/web/dir/file.html。ScriptAlias 指令功能相似,而且使所有目标路径下的所有文件被视为CGI脚本。

AliasMatch 和 ScriptAliasMatch指令可以实现基于正则表达式的匹配和替换,以提供更大的灵活性。例如:

ScriptAliasMatch ^/~([a-zA-Z0-9]*)/cgi-bin/(.*) /home/$1/cgi-bin/$2

上述命令可以映射 ~user/cgi-bin/script.cgi 为/home/user/cgi-bin/script.cgi ,并视之为CGI脚本。

用户目录

在Unix系统中,一个特定用户user的主目录通常是~user/。模块mod_userdir在网络上沿用了这个概念,允许使用URL访问位于各用户主目录下的文件,例如:

~user/file.html

出于安全原因,不应该给予网络用户直接操作主目录的权限,而应该在用户主目录下建一个新目录,把网络文件放在新目录中,并用UserDir指令告诉服务器。 缺省的用户目录设置是 Userdir public_html,因此,上述例子中的URL会映射到/home/user/public_html/file.html,其中/home/user/是/etc/passwd指定的用户主目录。

当/etc/passwd没有指定主目录,那就要用到Userdir指令的另几种形式。

有些人觉得符号"~"(时常会被编码为%7e)很别扭,希望用其他形式来表达用户目录。 虽然模块mod_userdir并不支持,但是,如果合理规划服务器上的用户目录,则还是有可能用AliasMatch指令来达到这个目的。例如,如果希望upages/user/file.html 映射到 /home/user/public_html/file.html,可以这样使用AliasMatch指令:

AliasMatch ^/upages/([a-zA-Z0-9]*)/?(.*) /home/$1/public_html/$2

URL的重定向

上述指令都指示Apache返回给客户文件系统的某个特定内容,但是有时候,需要通知客户其请求的内容位于其他URL,并使客户产生新的对其他URL的请求,这种机制称为“重定向(redirection)”,可以用Redirect指令实现。例如:如果DocumentRoot的目录/foo/被转移到了/bar/,则可以这样引导客户访问新的位置:

Redirect permanent /foo/ bar/

这个命令重定向任何以/foo/开头的URL路径到位于同一个服务器的/bar/。当然,可以重定向到任何服务器,而不仅仅是原来的那个。

Apache还提供了RedirectMatch 指令来解决复杂的重定向问题。例如,要重定向对站点主页的请求到其他站点,而保留其他所有请求,可以这样配置:

RedirectMatch permanent ^/$ startpage.html

另一种方法是,暂时地重定向站点的所有页面到一个特定页面,如:

RedirectMatch temp .* startpage.html

反向代理

Apache还允许将远程文档纳入到本地服务器的网络空间,由于Web服务器从远程服务器取得文档并返回给客户,在其中扮演了一个代理服务器的角色,所以这种机制被称为反向代理(reverse proxying),不同于标准代理的是,在客户看来,他请求的文档似乎原本就位于这个反向代理服务器上。

下例演示了,当客户请求位于/foo/目录下的文档时,服务器从internal.example.com的/bar/目录下取回文档并返回给客户,似乎文档原本就在本地服务器上

ProxyPass /foo/
ProxyPassReverse /foo/

ProxyPass指令使服务器正确地取回文档,同时,ProxyPassReverse指令改变了起始于internal.examle.com的请求,使之指向本地服务器上的目录。很重要的需要注意的是,被取回文档中的连接是不会被改写的,因此,文档中的所有绝对路径连接会突破代理机制而直接从internal.example.com取得。

URL的重写引擎

模块mod_rewrite提供了更强大的URL重写引擎,可以根据请求中诸如浏览器类型、源IP地址等特征来决定最终提交给客户的内容,还可以使用外部数据库或程序来决定如何处理一个请求,并可以执行上述的所有三种映射:内部重定向(aliases),外部重定向和代理。许多实用程序都用到了mod_rewrite,详细论述参见:URL重写指南(URL Rewriting Guide).

“文件没找到”

URL到文件系统的匹配失败是不可避免的,其产生原因有多种。有时是文档被转移了,对此最好是用URL的重定向来引导用户访问新的位置,如此,虽然资源已经转移到新的位置,但是原来的书签和连接仍然有效。

另一种常见的原因是在浏览器或者HTML连接中URL的无意的打字错误,Apache提供了模块mod_speling (sic) 以帮助解决这个问题。如果激活了这个模块,它会接管“文件没找到”的错误并查找相似文件,如果找到了唯一的一个,mod_speling会重定向到这个文件,如果不止一个,则会列一张表反馈给用户。

mod_speling的一个很有用的特性是,它可以忽略大小写查找文件,对不注意URL大小写的用户和unix文件系统尤为实用。但是,使用mod_speling来纠正偶然的URL错误会给服务器带来额外的负担,因为每次“不正确” 的请求都引发URL重定向和来自客户的新请求。

如果所有的努力都失败了,Apache会返回一个出错信息页面,其状态码为404(文件没找到),其页面内容取决于ErrorDocument指令,并可以灵活地自定义其形式,详见:自定义出错响应(Custom error responses) 和 国际服务器出错响应(International Server Error Responses)。
 
阅读(951) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~