location与rewrite的区别
rewrite :对访问的域名或者域名内的URL路径地址重写
location:对访问的路径做访问控制或者代理转发
从功能看 rewrite 和 location 似乎有点像,都能实现跳转,主要区别在于 rewrite 是在同一域名内更改获取资源的路径,而 location 是对一类路径做控制访问或反向代理,还可以proxy_pass 到其他机器。
location匹配规则顺序总结
在所有条件相同的条件下(location后面路径长度相同)优先级比较:
(location = 完整路径) > (location ^~ 路径) > (location ~,~* 正则顺序) > (location 部分起始路径) > (location /)
location匹配规则优先通用的总结 :
(1) 存在精准匹配时,直接采用
(2)在没有精准匹配的情况下,先看前缀匹配的长度,然后根据最长的前缀匹配的优先级去确定是否再去看其它正则匹配location。
(3)如果最长的前缀匹配带有 ^~ 则不再看其它正则匹配location,如果最长的前缀匹配是没有修饰符的一般匹配则会再看其它正则匹配location
(4) 前缀匹配看长度,最长的优先匹配
正则匹配看上下顺序,由上往下依次匹配,当有匹配成功时候,停止匹配,按当前匹配规则处理请求
(5)只有在精准、前缀、正则、一般 都没有匹配到的时候才会看通用匹配
rewrite运用示例
示例一:基于域名的跳转
需求:某公司旧域名www.yang.com有业务需求变更,需要使用新域名www.wang.com代替,但是旧域名不能废除,需要跳转到新域名上,而且后面的参数保持不变。
其他操作步骤:
echo "192.168.73.105 www.yang.com www.wang.com" >> /etc/hosts
systemctl restart nginx
浏览器输入模拟访问 http://www.yang.com/test/1.html(虽然这个请求内容是不存在的)
示例二:基于客户端 IP 访问跳转
需求:某公司业务新版本上线,要求所有 IP 访问任何内容都显示一个固定维护页面,只有公司 IP :192.168.255.128(指定的IP)访问正常。
示例三:基于旧域名跳转到新域名后面加目录
需求:现在访问的是 http://yang.wang.com/post/,现在需要将这个域名下面的访问都跳转到http://www.yang.com/bbs/post/
示例四:基于参数匹配的跳转
需求:现在访问http://www.yang.com/100-(100|200)-100.html 跳转到http://www.yang.com页面
示例五:基于目录下所有 php 结尾的文件跳转
需求:要求访问 http://www.yang.com/upload/123.php 跳转到首页。
示例六:基于最普通一条 url 请求的跳转
需求:要求访问一个具体的页面如 http://www.yang.com/abc/123.html 跳转到首页