Apache源代码注释之目录别名

节选自《Apache源代码解析-基于Apache0.6.5》第5章。

网址:http://www.oldapache.org

论坛:http://bbs.oldapache.org

邮箱:tsingien@gmail.com

 

 


 

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章。

网址:http://www.oldapache.org

论坛:http://bbs.oldapache.org

邮箱:tsingien@gmail.com

 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值