在nginx location中用alias代理文件

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

实验环境

静态资源目录

E: /static浏览器

  • a.js
  • b.js
  • /case/spa

    • 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是正则匹配时,较为特殊,容易出错。code

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

这种状况若是出错,通常就是因为对location URI部分和alias部分最后加不加“/”犯糊涂致使的,
或者说是不清楚这种状况下最终代理到什么path致使的。server

// 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。get

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。it

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

所以,代理目录时,location仍是正则匹配的话,是没法访问到这个目录下的各个文件的。

解决办法有两个。

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