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