要实现前后端分离开发,就不可避免在开发时面对跨域访问后端接口的问题。解决跨域的一个好方案就是设置代理。在使用 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 如果路径匹配那么不测试正则表达式。
评论 (0)