Nginx location匹配规则
url匹配规则
- = : 表示精确匹配后面的url
- ~ : 表示正则匹配,但是区分大小写
- ~* : 正则匹配,不区分大小写
- ^~ : 表示普通字符匹配,如果该选项匹配,只匹配该选项,不匹配别的选项,一般用来匹配目录
- @ : "@" 定义一个命名的 location,使用在内部定向时,例如 error_page
上述匹配规则的优先匹配顺序:
- = 前缀的指令严格匹配这个查询。如果找到,停止搜索;
- 所有剩下的常规字符串,最长的匹配。如果这个匹配使用 ^~ 前缀,搜索停止;
- 正则表达式,在配置文件中定义的顺序;
- 如果第 3 条规则产生匹配的话,结果被使用。否则,使用第 2 条规则的结果。
目标地址处理规则
匹配到uri后,接下来要代理到目标服务地址。
上述配置,默认访问/
会重定向到/my-module
, 然后直接返回/data/my-module/dist
下的html等静态文件。
访问/my-module/api
则会代理到我们api服务器地址,是一个默认的round-robin负载均衡配置。
下面是访问localhost的日志, 访问首页一共进行了2次重定向。
alias与root的区别
root 实际访问文件路径会拼接URL中的路径
alias 实际访问文件路径不会拼接URL中的路径
示例如下:
请求:http://test.com/sta/sta1.html
实际访问:/usr/local/nginx/html/static/sta1.html
文件
请求:http://test.com/tea/tea1.html
实际访问:/usr/local/nginx/html/tea/tea1.html
文件
显然,第二次重定向是不需要的,本意是访问/flash/的时候,直接访问对应目录下的html静态文件。 但因为root拼接flash导致找不到对应文件,要重写url,去掉flash这个模块前缀,使用了rewrite
, 而rewrite
会返回302重定向。
接下来,我们修改root
为alias
直接重定向1次后返回html
last 和 break关键字的区别
只用到了break,即匹配到此处后不会继续跳。
permanent 和 redirect关键字的区别
- rewrite … permanent 永久性重定向,请求日志中的状态码为301
- rewrite … redirect 临时重定向,请求日志中的状态码为302
我们常用的80端口转443,即http转https的一种配置方案为:
会返回301永久重定向到对应的https:
一些使用场景
上述demo差不多就是我平时用的前后端分离的代理配置方案。下面是一些遇到过的场景。
配置一个静态文件下载服务,我们下面软件会经常看到index /的页面。
配置http重定向到https
配置静态前端页面
配置反向代理, 比如我们访问http://demo.com/api/aaa/bbb,我们想要代理到http://api.com/api/aaa/bbb, 只切换了域名,uri相同。
配置反向代理时,移除前缀。比如我们的服务http://demo.com/users/aaa/bbb, 我们想要代理到http://users.com/aaa/bbb,即切换域名的同时,去掉users前缀。区别是proxy_pass 结尾的/
.
反向代理时,想要自定义修改uri。使用rewrite正则修改。
代理跨域, 比如bing每日一图,不支持我们ajax获取图片地址,我们可以自己写一个支持的接口。
http://101.200.218.760/proxy/bing/HPImageArchive.aspx?format=js&idx=0&n=1
代理对象为:
https://cn.bing.com/HPImageArchive.aspx?format=js&idx=0&n=1