分类
Web

Nginx中配置location

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

语法规则: 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 如果路径匹配那么不测试正则表达式。