Hello!
2012/6/18 level077 <lev...@163.com>:
>
> location /proxy {
> set $a 1;
> if ($a=1) {
> set $a 2;
> break;
> }
> set $a 3;
> proxy_pass http://127.0.0.1:8080/2.htm;
> }
>
> 这两个配置就proxy_pass处不一样,但对于第一个配置,请求/proxy返回200,第二个则是404,这是什么原因?
>
第二个例子不能如期工作的原因是因为 ngx_proxy 模块中有一个小问题,让 if 配置块在此种情况下未能恰当继承 location
/proxy 配置块中的 ngx_proxy 的配置(在源码级别上即是没有继承 plcf->location 这个字符串,在上例中便是
"/proxy"),于是导致 ngx_proxy 生成的请求 URI 是 /2.html/proxy,而不是期望中的 /2.html.
解决的办法是给标准的 ngx_proxy 模块打一个小补丁,这样你的第二个例子就可以如期工作了(见邮件的末尾或附件)。
这个补丁生成自标准 nginx 1.0.15,但也可以应用于 nginx 1.2.1.
如果你不想打补丁的话,也可以通过在 proxy_pass 参数串中引入 nginx 变量的办法绕过。比如你第一个例子那样),或者更一般地:
proxy_pass http://127.0.0.1:$server_port/2.htm;
Best regards,
-agentzh
--- nginx-1.0.15/src/http/modules/ngx_http_proxy_module.c 2012-03-15
19:41:43.000000000 +0800
+++ nginx-1.0.15-patched/src/http/modules/ngx_http_proxy_module.c 2012-06-18
22:27:32.715568165 +0800
@@ -2046,7 +2046,7 @@
if (conf->upstream.upstream || conf->proxy_lengths) {
clcf = ngx_http_conf_get_module_loc_conf(cf, ngx_http_core_module);
- if (clcf->handler == NULL && clcf->lmt_excpt) {
+ if (clcf->handler == NULL) {
clcf->handler = ngx_http_proxy_handler;
conf->location = prev->location;
}
Attachment:
nginx-1.0.15-fix_proxy_pass_in_location_if.patch
Description: Binary data