本公众号内容大多由平时操作整理记录,如果有错误的地方欢迎留言指正
Nginx rewrite重定向
nginx的ngx_http_rewrite_module模块提供了URL重定向的功能,rewrite模块支持URL重定向,支持if条件判断,(if中不支持else),支持通过正则表达式进行URL路径匹配,因此该模块需要pcre的支持。
rewrite是实现URL重写的关键指令,根据regex(正则表达式)部分内容,重定向到replacement,结尾是flag标记。
语法规则
rewrite作用范围:server, location, if
语法剖析
rewrite : 关键词,指令
regex: 正则表达式,匹配url路径
replacement : 替换内容,重定向的新url路径
flag : rewrite支持的flag标记
flag标识
last :last:重写完成后停止对当前URL在当前location中后续的其它重写操作,而后对新的URL启动新一轮重写检查;提前重启新一轮循环,不建议在location中使用
break : 重写完成后停止对当前URL在当前location中后续的其它重写操作,而后直接跳转至重写规则配置块之后的其它配置;结束循环,建议在location中使用
redirect :临时重定向,重写完成后以临时重定向方式直接返回重写后生成的新URL给客户端,由客户端重新发起请求;使用相对路径,或者http://或https://开头,状态码:302
permanent : 重写完成后以永久重定向方式直接返回重写后生成的新URL给客户端,由客户端重新发起请求,状态码:301
注意点
如果在同一级配置块中存在多个rewrite规则,那么会自下而下逐个检查;被某条件规则替换完成后,会重新一轮的替换检查
rewrite隐含有循环机制,但不超过10次;如果超过,提示500响应码,[flag]所表示的标志位用于控制此循环机制
如果在同一级配置块中存在多个rewrite规则,那么会自下而下逐个检查;被某条件规则替换完成后,会重新一轮的替换检查,如果flag标识设置不当会导致死循环匹配,导致出错:
例如:下面的规则设置临时重定向,但访问时提示错误
提示如下错误:
rewrite执行匹配第一次之后会将新的URL地址与前面的URL再次匹配,只要匹配到相同内容就会一直循环。直到循环到限制的最大次数后报错,而后面的flag标识只有break才能控制rewrite匹配一次就结束
将上面的flag改为break后测试
正则匹配与后向引用
regex:匹配使用到的正则:
replacement中的后向引用:
在匹配URL的正则中使用分组将特定的匹配字符选中,在后面的重定向中使用引用分组的方式引用前面的正则匹配内容,replacement中使$1,$2引用regex中的分组正则表达式。
示例:
if条件匹配
在进行rewrite重定向前可以使用if条件匹配判断,如果为true,则执行在大括号内指定的此模块指令
if作用范围:server, location
添加判断操作如下
当表达式只是一个变量时,如果值为空或任何以0开头的字符串都会当做false;
使用“=”和“!=”比较一个变量和字符串;
使用“~”做正则表达式匹配,“~*”做不区分大小写的正则匹配,“!~”做区分大小写的正则不匹配;
使用“-f”和“!-f” 检查一个文件是否存在;
使用“-d”和“!-d”检查一个目录是否存在;
使用“-e”和“!-e”检查一个文件、目录、符号链接是否存在;
使用“-x”和“ !-x”检查一个文件是否可执行;
示例
return 指令
作用范围:server,location,if;停止处理并将指定的内容返回code给客户端,
if条件判断中常用到的变量
示例
域名跳转:
访问www.a.com内容时跳转跳转到www.b.com,b.com在另一台主机,跨主机跳转
测试
路径跳转
当访问www.a.com/gudao/下的所有html页面时跳转到www.b.com/yufu/下
Nginx防盗链配置
nginx防盗链由ngx_http_referer_module模块支持,用来阻止Referer首部无有效值的请求访问,可防止盗链。
作用范围: server, location
语法:
valid_referers none | blocked | server_names | string …;
参数:
none:请求标头中缺少“Referer”字段;
blocked :“Referer”字段出现在请求标头中,但其值已被防火墙或代理服务器删除; 这些值是不以“ http://”或“ https://” 开头的字符串;
server_names : “Referer”请求头字段包含一个服务器名称;
示例
领取专属 10元无门槛券
私享最新 技术干货