Nginx rewrite以及proxy_pass

一、首先,本来开始的时候为了方便上传图片的存储和获取,使用了一个接口:

getImage?filename=IMG20160613165022MXD8IE8LSX7WCVGZFJL4OVRGKCZKTJ.jpeg

这种情况下,是使用程序直接返回图片的流,缺点是这些请求图片操作很影响程序的性能。

后来改变:

使用Nginx作为请求转发,将所有上传的图片拦截不经过Tomcat直接返回

server {
        listen       80;
        server_name  localhost;

        location ~* .*\.(gif|jpg|jpeg|png|bmp)$ {
            rewrite "^/getImage?filename=([A-Z]{3})([0-9]{4})([0-9]{2})([0-9]{2})(.*)$" http://$host:8090/$1/$2/$3/$4/$1$2$3$4$5;
        }
        location ^~ /{
            proxy_pass http://localhost:8080;
        }
    }

但是发现不能实现,原因是因为文件文件名在这是参数形式(可能本来是可以的,但是我没有弄出来)

只能改变图片的获取URL

getImage/IMG20160613165022MXD8IE8LSX7WCVGZFJL4OVRGKCZKTJ.jpeg

server {
    listen       80;
    server_name  localhost;
    location ~* .*\.(gif|jpg|jpeg|png|bmp)$ {
        rewrite "^/getImage/[A-Z]{3})([0-9]{4})([0-9]{2})([0-9]{2})(.*)$" http://$host:8090/$1/$2/$3/$4/$1$2$3$4$5;
    }
    location ^~ /{
        proxy_pass http://localhost:8080;
    }
}

这个时候一直发现不成功,将下面的location ^~ /注释掉之后就可以了,这里有问题,后来发现这么一句:

顺序 no优先级:

(location =) > (location 完整路径) > (location ^~ 路径) > (location ~,~* 正则顺序) > (location 部分起始路径) > (/)

肯定是^~较高直接匹配这个了,所以将^~删掉

server {
        listen       80;
        server_name  localhost;
    location ~* ^/getImage/.*\.(gif|jpg|jpeg|png|bmp)$ {
        rewrite "^/getImage/([A-Z]{3})([0-9]{4})([0-9]{2})([0-9]{2})(.*)$" http://$host:8090/$1/$2/$3/$4/$1$2$3$4$5;
    }
        location /{
        proxy_pass http://localhost:8080;
    }
}

OK!

二、我在服务器的图片存储做了一个路径转移

IMG20160613165022MXD8IE8LSX7WCVGZFJL4OVRGKCZKTJ.jpeg存储在 .../IMG/2016/06/13/IMG20160613165022MXD8IE8LSX7WCVGZFJL4OVRGKCZKTJ.jpeg

所以才有上面的 rewrite "^/getImage/([A-Z]{3})([0-9]{4})([0-9]{2})([0-9]{2})(.*)$" http://$host:8090/$1/$2/$3/$4/$1$2$3$4$5;

注意:location ~* ^/getImage/.*\.(gif|jpg|jpeg|png|bmp)$,前面的 ^/getImage/要加,不加的话会匹配所有图片(包括网页元素,我只希望是上传的图片)

附:

https://segmentfault.com/a/1190000002797606

http://www.cnblogs.com/buffer/p/3204718.html

评论

Your browser is out-of-date!

Update your browser to view this website correctly. Update my browser now

×