Nginx 中配置 location

Flying
2017-03-28 / 0 评论 / 112 阅读 / 正在检测是否收录...

要实现前后端分离开发,就不可避免在开发时面对跨域访问后端接口的问题。解决跨域的一个好方案就是设置代理。在使用 Webpack 普及之前,一般是用 nginx 的反向代理来完成的。Webpack 代理也只是开发阶段用得到,即使这样,开发也要注意在开发阶段提前验证一下前端代码打包后的效果。大家有没有遇到过这样尴尬的事,开发环境样式妥妥的,到测试生产环境样式被覆盖了。这种情况下前端也可以将前端代码放到本地 nginx 上设置代理来提前验证一下。

nginx.svg

语法规则:

location [=|~|~*|^~] /uri/ { … }

  • =:开头表示精确匹配
  • ^~:开头表示 uri 以某个常规字符串开头,理解为匹配 url 路径即可。
    nginx 不对 url 做编码,因此请求为 /static/20%/aa,可以被规则^~ /static/ /aa 匹配到(注意是空格)。
  • ~:开头表示不区分大小写的正则匹配
  • ~*:开头表示不区分大小写的正则匹配
  • !~:表示区分大小写不匹配的正则匹配
  • !~*:表示不区分大小写不匹配的正则配
  • /:通用匹配,任何请求都会匹配到。

示例

#精确的正则表达式注册
location = /abc/index.html {
  root /data/eq;
  index index.html;
}
#大小写敏感的正则表达式注册
location ~ \.(gif|jpg|jpeg)$ {
  root /data/ignoreuperlower;
  index index.jpg;
}
#忽略大小写的正则表达式注册
location ~* \.(gif|jpg|jpeg)$ {
  root E:/static;
  index index.jpg;
}
#注册正则表达式以什么开头的 path
location ^~ /images.* {
  root /data/images;
  index index.jpg;
}
#匹配任意所有的正则表达式
location / {
  root /usr/share/nginx/html;
  index index.html index.htm;
}

注意

匹配的顺序是先匹配普通字符串,然后再匹配正则表达式。另外普通字符串匹配顺序是根据配置中字符长度从长到短,也就是说使用普通字符串配置的 location 顺序是无关紧要的,反正最后 nginx 会根据配置的长短来进行匹配,但是需要注意的是正则表达式按照配置文件里的顺序测试。找到第一个比配的正则表达式将停止搜索。

一般情况下,匹配成功了普通字符串 location 后还会进行正则表达式 location 匹配。有两种方法改变这种行为,其一就是使用“=”前缀,这时执行的是严格匹配,并且匹配成功后立即停止其他匹配,同时处理这个请求;另外一种就是使用“^~”前缀,如果把这个前缀用于一个常规字符串那么告诉 nginx 如果路径匹配那么不测试正则表达式。

8

评论 (0)

取消