图片访问505

昨晚上传图片的时候发现上传成功后图片不显示缩略图了。。
看了下路径,访问路径为 /article/life/psb (1).jpg/64,初步确定是文件路径中包含空格导致的。
再看下日志,确定这是tomcat的问题而不是nginx。
但奇怪的是,访问/article/life/psb%20(1).jpg/64也同样返回505错误码。
google了下发现是nginx转发路径出了问题,原来的配置:
 location @doThumb {
            root   html;
            index  index.html index.htm;
            proxy_connect_timeout 3;
            proxy_send_timeout      30;
            proxy_read_timeout      30;
            proxy_pass http://localhost:8080/image$uri;
            proxy_set_header Host $host; 
            proxy_set_header  X-Real-IP  $remote_addr; 
        }

$uri在转发的时候会被decode,所以tomcat接受到的缩略图路径其实还是psb (1).jpg,这才返回505错误码。
google了下解决办法:
http://serverfault.com/questions/445554/nginx-uri-is-url-decoded

#The only way I found is to use the HttpSetMiscModule like so:
location ~
 ^/indirect {
  set_escape_uri $key $1;
  rewrite ^/indirect(.*) /foobar$key;
}

location ~ ^/foobar {
  set_escape_uri $key $uri;
  set $url http://example.com/something/index.php?var1=hello&access=$scheme://$host$key;
  proxy_pass $url;
}

还有:http://stackoverflow.com/questions/28684300/nginx-pass-proxy-subdirectory-without-url-decoding/37584637#37584637

server {
    listen 81;
    #first, the solution
    location /api/ {
        rewrite ^ $request_uri;
        rewrite ^/api/(.*) $1 break;
        return 400; #if the second rewrite won't match
        proxy_pass http://127.0.0.1:82/$uri;
    }
    #next, a few control groups
    location /dec/ {
        proxy_pass http://127.0.0.1:82/;
    }
    location /mec/ {
        rewrite ^/mec(/.*) $1 break;
        proxy_pass http://127.0.0.1:82;
    }
    location /nod/ {
        proxy_pass http://127.0.0.1:82;
    }
}

server {
    listen 82;
    return 200 $request_uri\n;
}

但最后在http://stackoverflow.com/questions/20496963/avoid-nginx-decoding-query-parameters-on-proxy-pass-equivalent-to-allowencodeds发现

location / {
    proxy_pass  http://tracking/webapp$request_uri;
}

这样也是可以的,虽然这个访问不适合有些场景:

Jean's answer is good, but it does not work with sublocations. In that case, the more generic answer is:
location /path/ {
  if ($request_uri ~* "/path/(.*)") {
    proxy_pass http://tracking/webapp/$1;
  }
}