如何通过Nginx将Perl函数的返回值设置到请求头中
Nginx Perl模块设置响应头问题解决方法
问题根源
perl_set定义的变量对应的函数仅用于计算变量值,不能包含send_http_header、print这类发送响应的操作,否则会破坏Nginx的请求处理流程。- Perl handler中,
header_out必须在send_http_header之前调用,否则响应头已发送,设置不会生效。 - 若location中同时使用
perl指令和add_header,perl指令会直接接管请求并发送响应,导致后续add_header指令不会执行。
解决方案一:通过perl_set配合add_header设置响应头
修改Nginx配置
http { perl_modules /opt/app-root/etc/nginx/nginx-perl/; perl_require module1.pm; perl_set $test module1::get_header_value; } location = /perl { add_header X-My-Header $test; return 200 "<h3>SUCCESS:</h3>"; }
修改Perl模块(module1.pm)
package module1; use nginx; sub get_header_value { my $r = shift; return 'foo'; } 1;
解决方案二:直接在Perl handler中设置响应头
修改Nginx配置
http { perl_modules /opt/app-root/etc/nginx/nginx-perl/; perl_require module1.pm; } location = /perl { perl module1::handler; }
修改Perl模块(module1.pm)
package module1; use nginx; sub handler { my $r = shift; my $foo = 'foo'; # 先设置所有响应头,再发送 $r->header_out("WWW-Authenticate", $foo); $r->header_out("X-My-Header", $foo); $r->send_http_header("text/html"); return OK if $r->header_only; # 处理HEAD请求,无需返回内容 $r->print("<h3>SUCCESS:</h3>"); return OK; } 1;
关键注意事项
perl_set的函数仅用于生成变量值,不能包含任何发送响应的操作。- 所有
header_out调用必须在send_http_header之前执行,否则设置的响应头无法被客户端接收。 - 使用
perl指令处理location时,整个请求的响应由Perl函数控制,Nginx后续指令(如add_header)不会再执行。
内容的提问来源于stack exchange,提问作者oitathi
相关产品推荐
相关产品推荐

