有这个nginx规则:
location ~ /test/ {
set $color '?';
set $subpath $1;
perl test::handle;
add_header Content-Type "text/html";
return 200 $color;
}
和这个perl文件:
package test;
use nginx;
sub handle {
my $r = shift;
$r->variable('color', 'blue');
return OK;
}
1;
__END__
我希望nginx能够提供字符串blue
但?
代替了。{
我测试了一个这样的子句柄:(正确修改注释return
的规则)
sub handle {
my $r = shift;
$r->send_http_header;
$r->print($r->variable('color'),'<br/>');
$r->variable('color', 'blue');
$r->print($r->variable('color'),'<br/>');
$r->flush();
return OK;
}
我得到了预期的结果:
?
blue
在第一种情况下,nginx是否在由perl设置之前提供$color
?
怎么避免这个?
澄清:
我需要在perl脚本中设置一堆变量,具体取决于请求,我可以为我需要设置的每个变量触发一个perl_set
,但我想将所有变量集成在一个函数中。
[编辑]
在perl_set
块中使用location
指令实际上是非法的,因此perl_set
不是基于每个请求。
答案 0 :(得分:1)
我知道这个答案已经过期了。但是我现在已经尝试过了。
您错了:
在位置块中使用perl_set指令实际上是非法的,因此,perl_set并非基于每个请求。
实际上,即使您应该在配置文件的http块中包括perl_set,代码也会在每次请求时重新评估。因此,如果您在http块中的config之下包含以下内容,则$ color将为蓝色;
perl_set $color '
sub {
my $r = shift;
return \'blue\';
}
';
但是请记住,http块中的perl_set将在位置块之前被显示出来,因此,如果在位置块中包含set $color '?';
,变量将始终具有?值。