9. Nginx Rewrite 功能
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了9. Nginx Rewrite 功能相关的知识,希望对你有一定的参考价值。
参考技术Anginx服务器利用ngx_http_rewrite_module模块解析和处理rewrite请求, 此功能依靠PCRE, 因此编译之前要安装PCRE库, rewrite是nginx服务器的重要功能之一, 用于实现URL的重写. URL的重写是非常有用的功能, 比如它可以在我们改变网站结构之后, 不需要客户端修改原来的书签, 也无需其他网站修改我们的链接, 就可以设置为访问, 另外还可以在一定程度上提高网站的安全性
用于条件匹配判断, 并根据条件判断结果, 选择不同的Nginx配置, 可以配置在server或location语句块中
Nginx的if语法仅能使用if做单次判断, 不支持使用if else或者if elif这样的多重判断, 用法如下:
使用正则表达式对变量进行匹配, 匹配成功时, if指令认为条件为true, 否则认为是false, 变量与表达式之间使用以下符号链接:
补充: 如果使用了if判断, 那么echo $变量必须放在if语句块才能生效
如果$变量的值为空字符串或者以0开头的任意字符串, 则if指令认为该条件为false, 其他条件为true
指定key并给其定义一个变量, 变量可以调用Nginx内置变量赋值给key, 另外set定义格式为set $key value
范例:
用于中断当前相同作用域(location, server, if)中的后续的rewrite模块中的指令, 一般用在location, 与该指令处于同一个作用域的Nginx中, 位于它前面的rewrite指令配置生效, 位于后面的 ngx_http_rewrite_module 模块中的指令就不再执行
return用于完成对请求的处理, 并直接向客户端返回响应状态码而非实际的页面内容, 同时, return前后的命令也都不会执行. 也就是只执行return命令 比如: 可以指定重定向URL(对于特殊重定向状态码, 301/302等)或者是指定提示文本内容(对于特殊状态码403/500等), 处于此指令后的所有Nginx配置都将不被执行, return可以在server, if和location语句块进行配置
return后可以接响应码, 直接返回给客户端, 也可以接响应码和提示信息, 返回给客户端, 或者接URL跳转, 通过301或者302跳转到其他链接
如果break和return同时出现, 那么return放在break后面时, 也不会执行, 因为return也属于rewrite的命令
由于没有做其他配置, 此时跳转会出现死循环, 第一次访问/时会跳转到https, 虽然跳转到了https, 但是仍然访问的是根, 又继续跳转, 进入死循环
详解: 第一次无论是访问http还是https, 由于都是访问的主站点/, 因此都会执行跳转到https, 跳转到https后, 仍然访问的是/, 因此会无限跳转, 直到超过跳转次数. 需要配置if条件, 来进行判断, 如果访问的是https, 那么就不跳转, 稍后演示
设置是否开启记录ngx_http_rewrite_module 模块日志记录到error_log日志文件当中, 可以配置在http, server, location或者if中
记录的是rewrite出现的错误日志
注意: 需要日志级别设定为notice
通过正则表达式的匹配来改变URI, 可以同时存在一个或多个指令, 按照顺序依次对URI进行匹配, rewrite主要是针对用户请求的URL或者URI做具体处理
rewrite可以匹配在server, location, if语句块中
语法格式:
rewrite将用户请求的URI基于regex所描述的模式进行检查, 如果匹配, 会将URI替换为其表达式指定的新的URI
注意: 如果在同一级别配置块中, 存在多个rewrite规则, 那么会自上而下逐个检查, 被某条件规则替换完成后, 会重新一轮的替换检查, 隐含循环机制, 但不会循环超过10次, 如果超过, 会提示500响应码, [flag]所表示的标志位用于控制此循环机制
如果替换后的URL是以http://或者https://开头, 则替换结果会直接以重定向返回给客户端, 即永久重定向301
正则表达式格式:
利用nginx的rewrite的指令, 可以实现url的重新跳转, rewrite有四种不同的flag, 分别是redirect(临时重定向), permanent(永久重定向), break和last.
其中, 前两种是跳转型的flag, 后两种是代理型, 跳转型指由客户端浏览器重新对新地址进行请求, 代理型是WEB服务器内部实现跳转
域名的临时调整, 后期可能会发生变化, 之前的域名或者URL可能还会使用, 或者跳转的目地域名和URL还会跳转, 这种情况下浏览器不会缓存跳转, 临时重定向不会缓存域名解析A记录, 而永久重定向会缓存
域名永久型调整, 即域名永远跳转至另一个新的域名, 之前的域名再也不使用, 跳转记录可以缓存到客户端浏览器
永久重定向会缓存DNS解析记录, 浏览器中请求报文头部会有 from disk cache 信息
域名临时重定向, 告诉浏览器域名不是固定重定向到当前目标域名, 后期可能随时会更改, 因此浏览器不会缓存当前域名的解析记录, 而浏览器会缓存永久重定向的DNS解析记录, 这也是临时重定向与永久重定向最大的本质区别
注意: 如果访问的是 http://pc.wang.org/break , 那么会显示new test111, 也就是rewrite到test1后继续到test1的location进行匹配执行
break适用于不改变客户端访问方式, 但是要将访问的目的URL做单次重写的场景, 比如: 有v1/v2两个版本的网站前端页面并存, 旧版本的网站数据在staticv1, 还不能丢失, 但是要将访问旧版本的请求重写到新的静态资源路径staticv2
last: 对某个location的URL匹配成功后, 会停止当前location的后续rewrite规则, 并结束当前location, 然后将匹配生成的新的URL跳转至其他location继续匹配, 直到没有location可以匹配, 将最后一次location的数据返回给客户端
last适用于不改变客户端访问方式, 但是要求多次目的URL重写的场景, 使用场景不是很多
无论是使用return 还是 rewrite https, 都会出现死循环跳转, 导致页面无法访问的情况, 因此, 需要配合if条件判断, 防止死循环
防盗链基于客户端请求报文携带的referer字段实现, referer是记录打开一个页面之前, 记录是从哪个页面跳转过来的标记信息, 如果别人只链接了其他网站的图片或者某个单独的资源, 而不是打开了整个网站页面, 那么就是盗链, referer字段显示的就是跳转之前的网站的域名, 正常的referer信息有以下几种:
以上是关于9. Nginx Rewrite 功能的主要内容,如果未能解决你的问题,请参考以下文章