一、首先,本来开始的时候为了方便上传图片的存储和获取,使用了一个接口:
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