看了看nginx的perl_module,差不多知道了个大概。 在nginx.conf的http域中,通过perl_modules指定模块路径,perl_require指定模块名称;location域中通过perl引用函数。 引用对象为$r->**,列举一下主要的参数: ·$r->args - 返回请求的参数。 ·$r->discard_request_body - 告诉nginx忽略请求主体。 ·$r->filename - 更具URI的请求返回文件名。 $r->has_request_body(function) - 如果没有请求主体,返回0,但是如果请求主体存在,那么建立传递的函数并返回1,在程序的最后,nginx将调用指定的处理器。 ·$r->header_in(header) - 检索一个HTTP请求头。 ·$r->header_only - 在我们只需要返回一个应答头时为真。 ·$r->header_out(header, value) - 设置一个应答头。 ·$r->internal_redirect(uri) - 使内部重定向到指定的URI,重定向仅在完成perl脚本后发生。 ·$r->print(args, …) - 为客户端传送数据。 ·$r->request_body - 在请求主体未记录到一个临时文件时为客户返回这个请求主体。为了使客户端的请求主体保证在内存里,可以使用client_max_body_size限制它的大小并且为其使用的缓冲区指定足够的空间。 ·$r->request_body_file - 返回存储客户端需求主体的文件名,这个文件必须在请求完成后被删除,以便请求主体始终能写入文件,需要指定client_body_in_file_only为on。 ·$r->request_method - 返回请求的HTTP动作。 ·$r->remote_addr - 返回客户端的IP地址。 ·$r->rflush - 立即传送数据到客户端。 ·$r->sendfile(file [, displacement [, length ] ) - 传送给客户端指定文件的内容,可选的参数表明只传送数据的偏移量与长度,精确的传递仅在perl脚本执行完毕后生效。 ·$r->send_http_header(type) - 为应答增加头部,可选参数“type”在应答标题中确定Content-Type的值。 ·$r->sleep(milliseconds, handler) - 设置为请求在指定的时间使用指定的处理方法和停止处理,在此期间nginx将继续处理其他的请求,超过指定的时间后,nginx将运行安装的处理方法,注意你需要为处理方法通过一个reference,在处理器间转发数据你可以使用$r->variable()。 ·$r->status(code) - 设置HTTP应答代码。 ·$r->unescape(text) - 以%XX的形式编码text。 ·$r->uri - 返回请求的URI。 ·$r->variable(name[, value]) - 返回一个指定变量的值,变量为每个查询的局部变量。
nginx本身关于该模块的例子不多。除了官网三个用法举例外,我只在一个博客上看到另一个用perl记录log的例子。好在apache的perl例子很多,大约可以参见一下: 在mod_perl:Code Snippets中关于mod_rewrite的两个举例:
package Apache::MyRedirect;
use Apache::Constants qw(OK REDIRECT);
use constant DEFAULT_URI => 'http://www.example.org';
sub handler {
my $r = shift;
my %args = $r->args;
my $path = $r->uri;
my $uri = (($args{'uri'}) ? $args{'uri'} : DEFAULT_URI) . $path;
$r->header_out(Location => $uri);
$r->status(REDIRECT);
$r->send_http_header;
return OK;
}
_END_
package My::Trans;
use Apache::Constants qw(:common);
sub handler {
my $r = shift;
my $uri = $r->uri;
my ($id) = ($uri =~ m|^/articles/(.*?)/|);
$r->uri("/articles/index.html");
$r->args("id=$id");
return DECLINED;
}
1;
_END_
而在perl cookbook中的21.4节redirecting the browser中,则说明了perl模块的两种转向方法及其流程的不同:
$r->header_out(Location => “http://www.example.com/somewhere”);
return REDIRECT;
这个方法,是要把新url返回给browser,由browser端再发出DNS解析等一系列请求活动;
$r->internal_redirect($new_partial_url);
return OK;
这个方法,是server自己内部重定向,虽然apache本身对这个请求依然要从头开始走一遍流程。而且这里的新url,只需要提供一个相对路径——唯一要注意的,是这个redirect之后不能再进行逻辑判断了,最好直接返回OK。