nginx rewirte重定向规则

本公众号内容大多由平时操作整理记录,如果有错误的地方欢迎留言指正

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”请求头字段包含一个服务器名称;

示例

  • 发表于:
  • 原文链接https://kuaibao.qq.com/s/20180713G1UGD000?refer=cp_1026
  • 腾讯「腾讯云开发者社区」是腾讯内容开放平台帐号(企鹅号)传播渠道之一,根据《腾讯内容开放平台服务协议》转载发布内容。
  • 如有侵权,请联系 cloudcommunity@tencent.com 删除。

扫码关注腾讯云开发者

领取腾讯云代金券