节选自《Apache源代码解析-基于Apache0.6.5》第5章。
5.1概述
从第一章中我们知道,htdocs目录是存放客户端可访问网站资源的地方(当然,您也可以设置成其它目录,本书中除特殊说明外,按照Apache的默认目录结构描述)。这样设计的初衷是为了方便管理,但是也带来了一个问题:网站无法对该目录外的资源进行访问。
本章讲述的目录别名为我们解决了这个问题,它提供了一种访问文档路径(htdocs目录)外资源的一种方式。
Apache0.6.5使用文件http_alias.c来处理和别名相关的操作。
Apache提供一种方式,给不在文档目录下的文件在页面上引用提供了方便。Apache0.6.5提供了三种类型的别名定义指令,分别是Alias、ScriptAlias和Redirect。
另外一个指令UserDir也作为一个别名在http_alias.c中处理。
5.2使用目录别名
5.2.1为什么使用目录别名
如果你是一个程序员,可能不打算让你的文档路径给非程序员操作,但是有时候你又要使用其它人提供的资源,如图片资源,这些资源可能给专门的美工来维护,如 果您把文档路径操作权限给美工,由于专业背景的不同,他们的误操作可能导致技术性问题。把这些图片放在您的文档目录之外是一个明智的做法。
Apache的目录别名可以实现这个功能。
当然,使用目录别名的出发点可能有很多(比如提供Linux用户的个人站点服务),我们不能也不打算一一列举,我们在这里有一个大概的印象即可。
注意:从现在开始,本书中所有出现http://www.yourdomain.com 的位置,都换成您自己的主机地址,如http://www.google.cn 或http://11.22.33.44:8181。
5.2.2如何使用目录别名
Apache0.6.5提供了三种设置别名的指令。分别是Alias、ScriptAlias和Redirect。
1. Alias
语法:Alias URL-path file-path |
directory-path
功能 :URL-path 路径开头的 URL 被映射到以directory-path 开头的本地文件
示例 :Alias /res/images /ftp/actor/images
上面的示例指定,对 http://www.yourdomain.com/res/images/logo.gif 的请求,服务器将返回 /ftp/actor/images/logo.gif 。
2. ScriptAlias
语法:ScriptAlias
URL-path file-path |
directory-path
功能:和Alias指令相同。但同时它又标明此目录中含有应该由cgi-script处理器处理的CGI脚本。
示例:ScriptAlias
/cgi-bin/ /www/cgi-bin/
上面的示例指定,对http://www.yourdomain.com/cgi-bin/test.cgi
的请求会引导服务器执行/www/cgi-bin/test.cgi
脚本
3. Redirect
语法:Redirect
URL-path URL
功能 :发送一个外部重定向使客户端重定向到一个不同的URL
示例:Redirect
/test
http://www.oldapache.org
上面的示例指定,如果客户端请求http://www.yourdomain.com/test/hello.txt,则会被重定向到http://www.oldapache.org
4.UserDir
语法:UserDir
directory-filename
功能 :指定用户网站的目录
示例 :UserDir /public_html
上面的示例指定,如果客户端请求http://www.yourdomain.com/~laoli/index.html ,则服务器返回/home/laoli/public_html/index.html。
5.3目录别名实践
目录别名的设置在srm.conf配置文件中完成。下面我们一一说明他们的配置方法和达到的效果。
注意:本章中描述的目录、配置文件信息以第一章中描述内容为准,如果您的目录信息和目录中的内容和第一章中的描述不符,请做相应修改。
5.3.1 指令实践
1. Alias 测试
在配置文件srm.conf中找到行
Alias /icons/ /home/devel/apache_0.6.5/icons/
如果前面有注释,去掉注释。
在icons目录下面有一个back.gif文件。在您的浏览器地址里面输入http://www.yourdomain.com/icons/back.gif 。可以看到,服务器返回的图片即是/home/devel/apache_0.6.5/icons目录下的back.gif文件。
2. ScriptAlias 测试
在配置文件srm.conf中找到行
ScriptAlias /cgi-bin/ /home/devel/apache_0.6.5/cgi-bin/
如果前面有注释,去掉注释。
在cgi-bin目录下有一个脚本文件date。可以在您的浏览器路径里面输入http://www.yourdomain.com/cgi-bin/date ,以测试输出效果。测试之前请确认date文件有执行权限。如果不出意外,应该显示当前时间。
3. Redirect 测试
这是一个重定向配置,srm.conf文件中默认没有这项配置。可以通过在srm.conf文件最后面增加这样一行:
Redirect /test http://www.google.cn/
在浏览器地址栏里面输入http://www.yourdomain.com/test/index.html ,您的浏览器直接重定向到http://www.google.cn 页面了。
4. UserDir 测试
在配置文件srm.conf里面。默认有一行UserDir public_html。我们现在测试它的行为。
登录您的服务器,在您的默认工作目录下(如果您是以用户名devel登录的,这个目录应该是/home/devel)创建目录public_html。在这个目录下创建文件index.html,内容可以是简单的hello world。然后在您的浏览器地址栏里面输入http://www.yourdomain.com/~devel ,如果没有意外,您应该能看到/home/devel/public_html/index.html的输出。
这种设置方式曾经在某些提供免费空间的网站上使用过。
5.3.2 进程中的数据
在做完上述修改后,您可以通过输出http_alias.c中定义的链表a和链表v的内容来查看此时进程中的数据。
可以在http_config.c(功能:读取配置并赋值相应的变量)文件中的read_config函数最后加上一个对函数output_alias的调用。在http_alias.c中实现该函数,同时在httpd.h文件中声明该函数。
函数output_alias原型如下:
void output_alias()
{
alias *p = a;
int loopi = 0;
while(p)
{
printf("a[%d]->fake = %s, a[%d]->real = %s, a[%d]->script = %d/n", loopi, p->fake, loopi, p->real, loopi, p->script);
loopi ++;
p = p->next;
}
p = v;
loopi = 0;
while(p)
{
printf("v[%d]->fake = %s, v[%d]->real = %s, v[%d]->script = %d/n", loopi, p->fake, loopi, p->real, loopi, p->script);
loopi ++;
p = p->next;
}
}
重新编译httpd。执行后可以看到输入类是这样:
a[0]->fake = /icons/, a[0]->real = /home/devel/apache_0.6.5/icons/, a[0]->script = 0
a[1]->fake = /cgi-bin/, a[1]->real = /home/devel/apache_0.6.5/cgi-bin/, a[1]->script = 1
v[0]->fake = /test, v[2]->real = http://www.google.cn/, v[0]->script = 0
这样看起来不够直观,此时内存中的链表数据类似于下图所示:
5.4 代码注释
限于篇幅,注释代码部分请参看本书官网。
节选自《Apache源代码解析-基于Apache0.6.5》第5章。