最近恰好帮一位同事解决一个关于nginx静态资源配置的小问题。虽然很小,可是仍是琢磨了许久,不是nginx坑了我,就是我太菜了。哈哈,想着仍是把这点小知识记录下来,后期遇到一样的问题能够提升效率。nginx
需求很简单,大体就是:当url中以/res
为前缀时,表示该请求是静态资源请求,并将其重定向到静态资源路径去拿静态资源。bash
举个例子:post
当访问路径是:http://127.0.0.1:8080/res/风景.jpg
时,此时nginx应该返回一张美丽的风景图片.ui
这是一个再简单不过的需求了,使用nginx的配置以下:url
location /res/ {
root f:/res/;
}
复制代码
当匹配/res/
前缀时,访问f:/res/
目录下的静态资源文件。图片"风景.jpg"存放在f:/res/
目录下。spa
启动nginx后发现下面请求显示4043d
http://localhost/res/风景.jpg
日志
查看日志后发现,nginx实际上找的是f:/res/res/风景.jpg
这个路径下的图片,但因为f:/res/res/
没有这个图片固然报404啦!code
如今咱们将上面的nginx配置改为:cdn
location /res/ {
alias f:/res/;
}
复制代码
启动nginx后发现下面请求正常显示图片。
http://localhost/res/风景.jpg
查看日志后发现,nginx实际上找的是f:/res/风景.jpg
这个路径下的图片,但因为f:/res/
有这个图片固然不报404啦!
alias
和root
指令的区别就是:
一、root
不会将location
配置的路径去掉 也就是请求http://localhost/res/xxx
,不会忽略localhost
的配置,反而会加在root
配置的路径后面,变成f:/res/res/xxx
二、alias
会将location
配置的路径去掉
也就是请求http://localhost/res/xxx
,会忽略localhost
的配置,不会加在alias
配置的路径后面,变成f:/res/xxx
,location
的/res/
被忽略了。
最后,不要在postman上面访问中文名称的请求,好比http://localhost/res/风景.jpg
,因为postman不支持中文,永远都会显示404,否则你会说为何明明配置对了,在postman还不生效,哈哈,最后怀疑人生。