`
liuzhaomin
  • 浏览: 207556 次
  • 性别: Icon_minigender_1
  • 来自: 北京
文章分类
社区版块
存档分类
最新评论

apache内容生成器 (2)

阅读更多

13.8 目录处理器

13.8.1目录处理器概述

除了普通的磁盘文件之外,还有另外一种情况就是请求被映射到目录。那么这时候服务器就必须确定如何进行响应,通常情况下有三种情况可供选择:

1. 返回默认的索引页面。

大部分情况下这是默认的选择。通常默认页面会取名为default.htmlindex.html等名称。为了实现默认的索引页面,Apache中提供了mod_dir模块,它内部提供了DirectoryIndex指令用于指定默认的索引页面。

2. 发送目录中的所有文件的列表。

如果没有找到DirectoryIndex指令规定的文件,那么服务器就会生成目录中所有的文件的列表。这个由模块mod_autoindex实现。实现的原理很简单:服务器会查看目录中的所有的文件,然后为每个文件生成一行数据。

3. 返回错误页面响应消息

一些用户会对一些隐私的目录进行访问控制。如果用户访问到这些目录,此时,服务器会返回特定的错误页面给客户端以进行错误提示。

我们分别了解Apache是如何处理这三种处理器的。

13.8.2 返回默认页面处理器

mod_dir实质上并不是真正的内容处理器模块,不过它影响内容的生成方式。为了指定目录中的默认页面,mod_dir模块中提供了DirectoryIndex指令,比如:

DirectoryIndex index.html

这个指令会告诉服务器在目录中查找名为index.html的文件,并将其返回。

DirectoryIndex index.html default.html

这个指令告诉服务器在目录中首先查找名为index.html的文件,如果没有找到,再查找default.html文件。DirectoryIndex指令允许指定多个

DirectoryIndex index.html /indexes/nofile.html

这个指令告诉服务器在目录中首先查找名为index.html的文件,如果没有找到,再去DocumentRoot之下的/indexes目录中查找nofile.html

DirectoryIndex /cgi-bin/index.pl

这个指令高速服务器直接调用/cgi-bin/目录下的index.pl脚本进行执行。

DirectoryIndex指令可以出现在全局作用域中、虚拟主机、.htaccess文件、或者在<Directory>容器中使用。将<Directory>用于<Location><Files>中并不合理,因此不允许在那些地方使用它们。

如果你拥有多个能够作为默认文件使用的文件,那么就应该将最常用的文件列在最初的位置。这是因为服务器会根据文件所列的次序来对他们进行搜索,服务器在找啊哦所要的文件之前搜索的文件越多,它运行的速度就越慢。

mod_dir模块并不负责读取和生成返回给客户端的内容,而仅仅负责默认页面的设置处理。除了DirectoryIndex指令,mod_dir还支持另外一个指令DirectorySlashDirectorySlash指令决定mod_dir是否通过在请求的URL结尾补上"/"使其重定向到其所指向的目录。

代表性的,如果用户请求一个资源并且结尾没有"/",若该资源是指向一个目录,mod_dir将通过在请求的URL结尾补上"/"使其重定向到其所指向的目录。但是在原始请求中就必须加上结尾的"/"有以下好处:

1)用户必须使用规范的URL来请求资源。

2mod_autoindex将会正确工作。因为它并不会补全路径,所以将会指向错误的路径。

3DirectoryIndex将只评估有"/"结尾的目录。

如果你不希望这个自动重定向的功能生效,并且不在乎上述影响,你可以关闭它:

DirecotyrSlash OFF

Mod_dir中使用dir_config_rec记录目录配置信息:

typedef struct dir_config_struct {

apr_array_header_t *index_names;

slash_cfg do_slash;

} dir_config_rec;

index_names记录所有的出现在DirectoryIndex指令后面的索引页面名称。而do_slash则记录是否开启了DirectorySlash指令。

对于磁盘上的静态文件,默认是由default_handler处理器完成,不过如果客户端请求的是目录,并且目录中使用DirectoryIndex设置了默认的索引页面,则在请求处理之前,必须将默认索引页面和请求目录共同构成实际的文件路径。这一步必须在调用处理器之前完成。

Apache提供了fixups挂钩用以完成调用处理器之前所有的必须完成的“修补”工作。事实上对于mod_dir而言,将目录和索引文件组合成磁盘文件路径的工作也正好可以在该阶段完成,因此mod_dir模块中实现了fixups挂钩:

static void register_hooks(apr_pool_t *p)

{

ap_hook_fixups(fixup_dir,NULL,NULL,APR_HOOK_LAST);

}

module AP_MODULE_DECLARE_DATA dir_module = {

……

register_hooks /* register hooks */

};

fixup_dir函数的实现如下:

static int fixup_dir(request_rec *r)

{

dir_config_rec *d;

char *dummy_ptr[1];

char **names_ptr;

int num_names;

int error_notfound = 0;

if (r->finfo.filetype != APR_DIR) {

return DECLINED;

}

if (!r->handler) {

r->handler = DIR_MAGIC_TYPE;

}

if (r->path_info && *r->path_info) {

return DECLINED;

}

(1)mod_dir只能处理目录,不能直接处理文件。文件直接调用default_handler进行处理。

d = (dir_config_rec *)ap_get_module_config(r->per_dir_config,

&dir_module);

/* Redirect requests that are not '/' terminated */

if (r->uri[0] == '\0' || r->uri[strlen(r->uri) - 1] != '/')

{

char *ifile;

if (!d->do_slash) {

return DECLINED;

}

/* Only redirect non-get requests if we have no note to warn

* that this browser cannot handle redirs on non-GET requests

* (such as Microsoft's WebFolders).

*/

if ((r->method_number != M_GET)

&& apr_table_get(r->subprocess_env, "redirect-carefully")) {

return DECLINED;

}

if (r->args != NULL) {

ifile = apr_pstrcat(r->pool, ap_escape_uri(r->pool, r->uri),

"/", "?", r->args, NULL);

}

else {

ifile = apr_pstrcat(r->pool, ap_escape_uri(r->pool, r->uri),

"/", NULL);

}

apr_table_setn(r->headers_out, "Location",

ap_construct_url(r->pool, ifile, r));

return HTTP_MOVED_PERMANENTLY;

}

if (strcmp(r->handler, DIR_MAGIC_TYPE)) {

return DECLINED;

}

if (d->index_names) {

names_ptr = (char **)d->index_names->elts;

num_names = d->index_names->nelts;

}

else {

dummy_ptr[0] = AP_DEFAULT_INDEX;

names_ptr = dummy_ptr;

num_names = 1;

}

for (; num_names; ++names_ptr, --num_names) {

/* XXX: Is this name_ptr considered escaped yet, or not??? */

char *name_ptr = *names_ptr;

request_rec *rr;

/* Once upon a time args were handled _after_ the successful redirect.

* But that redirect might then _refuse_ the given r->args, creating

* a nasty tangle. It seems safer to consider the r->args while we

* determine if name_ptr is our viable index, and therefore set them

* up correctly on redirect.

*/

if (r->args != NULL) {

name_ptr = apr_pstrcat(r->pool, name_ptr, "?", r->args, NULL);

}

rr = ap_sub_req_lookup_uri(name_ptr, r, NULL);

/* The sub request lookup is very liberal, and the core map_to_storage

* handler will almost always result in HTTP_OK as /foo/index.html

* may be /foo with PATH_INFO="/index.html", or even / with

* PATH_INFO="/foo/index.html". To get around this we insist that the

* the index be a regular filetype.

*

* Another reason is that the core handler also makes the assumption

* that if r->finfo is still NULL by the time it gets called, the

* file does not exist.

*/

if (rr->status == HTTP_OK

&& ( (rr->handler && !strcmp(rr->handler, "proxy-server"))

|| rr->finfo.filetype == APR_REG)) {

ap_internal_fast_redirect(rr, r);

return OK;

}

/* If the request returned a redirect, propagate it to the client */

if (ap_is_HTTP_REDIRECT(rr->status)

|| (rr->status == HTTP_NOT_ACCEPTABLE && num_names == 1)

|| (rr->status == HTTP_UNAUTHORIZED && num_names == 1)) {

apr_pool_join(r->pool, rr->pool);

error_notfound = rr->status;

r->notes = apr_table_overlay(r->pool, r->notes, rr->notes);

r->headers_out = apr_table_overlay(r->pool, r->headers_out,

rr->headers_out);

r->err_headers_out = apr_table_overlay(r->pool, r->err_headers_out,

rr->err_headers_out);

return error_notfound;

}

/* If the request returned something other than 404 (or 200),

* it means the module encountered some sort of problem. To be

* secure, we should return the error, rather than allow autoindex

* to create a (possibly unsafe) directory index.

*

* So we store the error, and if none of the listed files

* exist, we return the last error response we got, instead

* of a directory listing.

*/

if (rr->status && rr->status != HTTP_NOT_FOUND

&& rr->status != HTTP_OK) {

error_notfound = rr->status;

}

ap_destroy_sub_req(rr);

}

if (error_notfound) {

return error_notfound;

}

/* nothing for us to do, pass on through */

return DECLINED;

}

13.8.3 返回文件列表

如果没有找到DirectoryIndex指令规定的文件,那么服务器就会生成目录中所有文件的列表。通常这由mod_autoindex文件完成。服务器会查看请求目录中的所有的文件并为每一个文件在相应中生成一条数据。当然mod_autoindex提供了非常多的指令,通过这些指令,你可以对列表的格式进行各种控制。

13.8.4 返回错误响应

在任何时候如果发生错误的时候,Apache都会返回对应的错误响应消息。

13.9 mod_info

13.5章中我们已经讨论了默认过滤器的处理细节,这种过滤器所针对的是实实在在的在磁盘中存在的静态HTML文件。因此它的主要任务就是读取对应的文件,并将其发送给客户端。本章中我们描述另外一种处理器的处理细节。alias_handlerinfo_handler以及status_handler等都属于这种处理器,他们并不处理实际的文件。而是针对特定的URL进行特定的处理。比如info_handler处理的是http://your.host.dom/server-info格式的URL,而status_handler则是处理http://your.host.dom/server-status

对于这种URLApache将会首先在配置文件中搜索,如果搜索到对应的针对该 URI的配置,那么他将直接调用对应的处理器进行处理。通常情况下处理过程并不会去读取磁盘中对应的文件,因为文件并不存在。处理器要做的就是生成特定的响应并返回给客户端

分享到:
评论

相关推荐

    软件著作权代码文档生成器v1.0.0源代码1

    在本文档生成器的POM文件中,定义了多个插件,包括Apache Maven Compiler Plugin和Apache Maven Build Plugin等。 五、Java语言 Java是一种面向对象的编程语言,广泛应用于软件开发领域。本文档生成器使用Java语言...

    Apache配置代码生成.rar

    这个“Apache配置代码生成.rar”文件显然是为了简化这个过程,帮助用户快速生成适用于多站点的Apache配置文件。 Apache配置文件通常位于服务器的`/etc/httpd/conf`(Linux)或`C:\Apache24\conf`(Windows)目录下...

    FreeMarker,Struts2,代码生成器

    在使用FreeMarker和Struts2时,代码生成器可以结合这两者的优势,自动生成符合这两框架规范的代码。例如,对于视图层,代码生成器可以基于FreeMarker模板生成HTML页面;而对于控制器层,可以生成基于Struts2 Action...

    apache2.zip

    6. **FastCGI和PHP支持**:Apache2可以通过mod_fastcgi和mod_php模块与FastCGI进程管理器一起工作,以支持动态内容生成,如PHP应用程序。 7. **安全**:Apache2支持SSL/TLS加密,通过mod_ssl模块实现HTTPS连接,...

    OpenSSL证书生成器

    OpenSSL 证书生成器 可用于apache的ssl证书生成

    代码生成器 代码生成器

    常见的开源代码生成器有JHipster、Apache Velocity和Dojo Builder等。 总之,代码生成器是现代软件开发中的重要工具,它通过自动化代码生成帮助开发者提升效率,降低错误,同时保持代码的一致性和可维护性。了解和...

    apache2与tomcat整合

    Apache2与Tomcat的整合主要依赖于一个名为mod_jk的模块,它是Apache的Java连接器,允许Apache与Tomcat之间进行通信。在这个案例中,使用的mod_jk版本是mod_jk-1.2.28-httpd-2.2.3.so,它需要与Apache和Tomcat的特定...

    Golang_GoHTTP负载生成器ApacheBench ab替代.zip

    本资源包“Golang_GoHTTP负载生成器ApacheBench ab替代”提供了一个用Go语言编写的HTTP负载生成器,作为ApacheBench的替代品。 这个负载生成器基于Go标准库中的"net/http"包,它允许开发者创建自定义的并发请求模式...

    天智Apache日志分析器

    "天智Apache日志分析器"是一款专为这项任务设计的工具,由VC++编程语言实现,提供免费且高效的服务。 Apache日志主要记录了服务器接收到的所有请求,包括但不限于用户访问的页面、访问时间、请求方法、HTTP状态码、...

    MP代码生成器所需依赖

    2. **Velocity模板引擎**:压缩包中的"velocity"文件可能包含 Velocity 模板,它是代码生成器用于生成实际Java代码的模版。Velocity是一个强大的文本处理引擎,可以用于生成HTML、XML、Java源代码等,是代码生成器中...

    用openssl为apache制作ssl证书

    ### 使用OpenSSL为Apache生成SSL证书 #### 一、引言 随着互联网技术的发展与用户对数据安全意识的提升,HTTPS协议已经成为网站标配之一。HTTPS不仅能够加密传输数据,还能验证服务器身份,确保用户访问的是真实...

    javaweb项目代码生成器

    代码生成器: 该项目为代码生成器 基于Apache Velocity的 Java模板引擎

    代码生成器

    1. **选择合适的代码生成器**:市面上有许多开源和商业的代码生成器可供选择,如MyBatis Generator、JPA Buddy、Apache Velocity等,每种都有其特点和适用场景,需要根据项目的技术栈和需求来挑选。 2. **配置参数**...

    Excel模板Java实体生成器

    接着,运行Java实体生成器,指定模板文件路径,程序会根据模板内容生成Java代码。生成的实体类可以直接在Eclipse或NetBeans这样的集成开发环境中导入,无需手动编写或复制粘贴代码,简化了开发流程。 【标签】"poi ...

    ssm代码高级生成器.rar

    "springmvc_dbutils_plus"可能是生成器的一个版本或特定功能,可能意味着该生成器除了SSM框架外,还支持使用DbUtils库进行数据库操作,DbUtils是Apache的一个简单数据库操作工具,可以简化JDBC操作。 总的来说,...

    一款很好用的生成器

    在IT领域,生成器是一种能够自动生成代码、文档、图像或其他内容的程序。在Java中,有许多库和框架可以帮助开发者创建这样的工具。例如,Apache Velocity或FreeMarker可以用来生成文本模板,如HTML或XML;而Java的...

    auto,Java源代码生成器的集合。.zip

    标题中的“auto,Java源代码生成器的集合”暗示了这是一个关于自动化生成Java源代码的开源项目。在软件开发过程中,源代码生成器能够大大提高开发效率,减少重复性工作,尤其是对于那些基于模板或规则的代码片段。...

    apache for linux安装

    Apache是一款开源、免费的Web服务器软件,它能够解析HTTP协议,处理来自Web浏览器的请求,并将静态网页或动态生成的网页返回给用户。由于其高度可定制性和丰富的模块扩展,Apache被广泛用于各种规模的网站和应用。 ...

    基于SpringBoot的代码生成器的设计和实现.doc

    该系统采用Apache Velocity作为模板引擎,它是一种强大的动态内容生成工具,可以高效地将模型信息转化为可执行的代码。同时,MySQL数据库用于存储模型和模板的元数据,确保了数据的安全性和稳定性。前端界面则利用...

    webService 生成插件apache-cxf(2.7.7)

    在Web服务开发中,Apache CXF作为一个生成插件,可以帮助开发者快速地创建、部署和消费Web服务。以下是使用Apache CXF 2.7.7版的一些关键知识点: 1. **WSDL First Approach**:CXF支持基于WSDL(Web Service ...

Global site tag (gtag.js) - Google Analytics