nginx perl设置变量

时间:2017-02-02 11:04:35

标签: perl nginx

有这个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不是基于每个请求。

1 个答案:

答案 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 '?';,变量将始终具有?值。