资讯专栏INFORMATION COLUMN

在nginx location中用alias代理文件

MockingBird / 1942人阅读

摘要:最终代理路径是路径部分和浏览器输入的未匹配到的部分。其中只有,直接返回。浏览器因此,代理目录时,还是正则匹配的话,是无法访问到这个目录下的各个文件的。关于既想用又想能代理到某目录下各个文件的解决办法方案方案用结合代替

介绍nginx中location块的匹配符(~, ~*, ^~, [space]等)与alias文件代理的关系

实验环境
静态资源目录

E: /static

a.js

b.js

/case/

c.js

d.js

e.js

nginx server块
server {
    listen       80;
    server_name  127.0.0.1;
}
alias代理特定文件

仅仅代理一个特定的文件,基本上很少会出错,
location块是前缀匹配和正则匹配均可。
如下,浏览器访问http://127.0.0.1/static/case/... 都返回c.js的内容。

    location /static/case/c.js {
        alias E:/static/case/c.js;
    }
    location ~ /static/case/c.js {
        alias E:/static/case/c.js;
    }
alias代理某目录下的各个文件

但当需要代理一个目录下的各个文件时,会因location块是前缀匹配和正则匹配的不同,导致代理的结果不同。
尤其是location是正则匹配时,较为特殊,容易出错。

location是前缀匹配^~或者[space]时

这种情况如果出错,一般就是由于对location URI部分和alias部分最后加不加“/”犯糊涂导致的,
或者说是不清楚这种情况下最终代理到什么path导致的。

// case1
location /static/case/ {
    alias E:/static/case/;
    autoindex on;
}
// case2
location /static/case {
    alias E:/static/case/;
    autoindex on;
}
case3
location /static/case/ {
    alias E:/static/case;
    autoindex on;
}
case4
location /static/case {
    alias E:/static/case;
    autoindex on;
}

以上四种情况,浏览器输入:http://127.0.0.1/static/case/... 只有第三种失败。
如果在这四种情况的location前面都加上 ^~ 结果也是一样的,因为 ^~ 和[space]都是前缀匹配。

**最终代理路径是: alias路径 + location部分URI和浏览器输入的URL未匹配到的部分。
这个路径下有文件,就200,没有文件,就404。**
所以分析一下为什么第三种写法不能正确代理呢,
浏览器URL: http://127.0.0.1/static/case/...,
location:/static/case/,
因此两个URL匹配部分是/static/case/,
未匹配部分是c.js。
因此它最终代理的path是:E:/static/case + c.js = E:/static/casec.js,相当于找static目录下有没有casec.js文件,因为没这个文件,所以404。

location是正则匹配~, ~*时
    location ~ /static/case/ {
        alias E:/static/case/;
        autoindex on;
    }

浏览器URL1:http://127.0.0.1/static/case/...
浏览器URL2:http://127.0.0.1/static/case/...
浏览器URL3:http://127.0.0.1/static/case/...
浏览器URL4:http://127.0.0.1/static/case/,
结果都是一样的,返回/static/case目录。
其中只有URL4,直接200返回。URL1-3都是301->200。

重定向不是无限的,当浏览器URL case后的层级大于10时,就不再301->200,而是直接200返回。
即,浏览器URL5,直接200返回。代理到/static/case目录。
浏览器URL5:http://127.0.0.1/static/case/...

因此,代理目录时,location还是正则匹配的话,是无法访问到这个目录下的各个文件的。

解决办法有两个。

    关于既想用~又想能代理到某目录下各个文件的解决办法:
    //方案1
    location ~ ^/(.+)/(.+)/(.+.js)$ {
        alias E:/static/case/$3;
    }
    //方案2、用root结合rewrite代替
    location ~ ^/.+/.+/.+.js$ {
        root E:/;
        rewrite ^/(.*) /$1 break;
    }

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/40240.html

相关文章

  • 开发环境下使用nginx重写uri及代理功能

    摘要:本文同步在个人博客上,欢迎关注这篇文章整理了在前端开发中,在开发环境下使用重写及代理功能的方法。表示该规则是使用正则定义的,区分大小写。因此牢记在上下文中使用,而在上下文中使用。 本文同步在个人博客shymean.com上,欢迎关注 这篇文章整理了在前端开发中,在开发环境下使用nginx重写uri及代理功能的方法。 参考 nginx中文文档 前端开发者必备的 Nginx 知识 Ngin...

    LMou 评论0 收藏0
  • 前端培训-初级阶段-场景实战(2019-06-13)-Nginx代理正确食用方式

    摘要:前端最基础的就是。我这边预期准备进入中级阶段,中间还是会穿插一些实战。语法精确匹配,匹配成功,则停止搜索正则不能有嵌套的。指令会根据在配置文件中出现的顺序依次执行,可以使用来终止接下来的处理。如果以或者或者,则停止处理,立刻重定向。 前端最基础的就是 HTML+CSS+Javascript。掌握了这三门技术就算入门,但也仅仅是入门,现在前端开发的定义已经远远不止这些。前端小课堂(HTM...

    Harpsichord1207 评论0 收藏0
  • 前端培训-初级阶段-场景实战(2019-06-13)-Nginx代理正确食用方式

    摘要:前端最基础的就是。我这边预期准备进入中级阶段,中间还是会穿插一些实战。语法精确匹配,匹配成功,则停止搜索正则不能有嵌套的。指令会根据在配置文件中出现的顺序依次执行,可以使用来终止接下来的处理。如果以或者或者,则停止处理,立刻重定向。 前端最基础的就是 HTML+CSS+Javascript。掌握了这三门技术就算入门,但也仅仅是入门,现在前端开发的定义已经远远不止这些。前端小课堂(HTM...

    seanHai 评论0 收藏0
  • Nginx反向代理解决前后端联调跨域问题

    摘要:反向代理前后端联调跨域什么是跨域跨域,指的是浏览器不能执行其他网站的脚本。这时候,用反向代理实现跨域,是最简单的跨域方式。 keywords: Nginx反向代理 前后端联调 跨域 1.什么是跨域 跨域,指的是浏览器不能执行其他网站的脚本。它是由浏览器的同源策略造成的,是浏览器对javascript施加的安全限制。 所谓同源是指,域名,协议,端口都相同。浏览器执行javascrip...

    QiuyueZhong 评论0 收藏0
  • Nginxalias 和 root的区别)

    摘要:和的区别和的区别访问一个文件时,显示的路径是访问一个文件时,显示的路径是也就是差异在没显示后面的路径想要获取用户的真实因为经过多层代理后,用户的真实会被代理覆盖掉的,所以在第一个代理服务器中设置并在最后一个代理服务器获取这样就可以直接在里执 Nginx(alias 和 root的区别)1.alias 和 root 的区别: location /request_path/image { ...

    Lyux 评论0 收藏0

发表评论

0条评论

最新活动
阅读需要支付1元查看
<