Nginx Rewrite
Rewrite重写
- Nginx Rewrite
- url组成说明
- Rewrite基本概述
- Rewrite使⽤场景
- rewrite优点
- Rewrite配置语法
- location匹配概述
- if指令
- if 判断指令语法
- nginx以及if 判断可使用的全局变量
- set命令
- return指令
url组成说明
https://cn.bing.com/search?q=Nginx+Rewrite&PC=U316&FORM=CHROMN
这个URL的格式可以分为以下⼏个部分:
- 协议部分:指定了访问资源的协议,这个URL使⽤了默认的协议HTTP、HTTPS。
- 域名部分:指定服务器的域名和顶级域名,这个URL的域名部分是cn.bing.com
- 路径部分:指定了服务器上要访问的资源的路径,这个URL的路径部分是/search
- 查询部分:包含了向服务器请求资源时所附带的数据,以键值对的形式进⾏传递,这个URL的查询部分是q=Nginx+Rewrite&PC=U316&FORM=CHROMN
Rewrite基本概述
rewrite
主要实现url
地址重写, 以及重定向
Rewrite使⽤场景
1.URL访问跳转: ⽀持开发设计, ⻚⾯跳转, 兼容性⽀持, 展示效果 www.wingsredevsecops.top/a.html 实际
www.wingsredevsecops.top/b.html
2.SEO优化: 依赖于url路径,以便⽀持搜索引擎录⼊
3.维护: 后台维护, 流量转发等
4.安全: 伪静态,真实动态⻚⾯进⾏伪装
rewrite优点
(1)URL看起来更规范、合理
- URL: 就是一个具体路径/位置
- URI: 指的是一个拥有相同类型/特性的对象集合
- URN:用名称定位
(2)企业会将动态URL地址伪装成静态地址提供服务
(3)网址换新域名后,让旧的访问跳转到新的域名上
(4)服务端某些业务调整
Rewrite配置语法
rewrite <regex> <replacement> [flag];
关键字 正则 替代内容 flag标记
关键字:其中关键字error_log不能改变
正则:perl兼容正则表达式语句进行规则匹配
替代内容:将正则匹配的内容替换成replacement
flag标记:rewrite支持的flag标记
flag标记说明:
last #本条规则匹配完成后,继续向下匹配新的location URI规则
break #本条规则匹配完成即终止,不再匹配后面的任何规则
redirect #返回302临时重定向,浏览器地址会显示跳转后的URL地址
permanent #返回301永久重定向,浏览器地址栏会显示跳转后的URL地址
常用的Nginx正则表达式
^ 匹配输入字符串的起始位置
$ 匹配输入字符串的结束位置
* 匹配前面的字符零次或多次。如“ol*”能匹配“o”及“ol”、“oll”
+ 匹配前面的字符一次或多次。如“ol+”能匹配“ol”及“oll”、“olll”,但不能匹配“o”
? 匹配前面的字符零次或一次,例如“do(es)?”能匹配“do”或者“does”,”?”等效于”{0,1}”
. 匹配除“\n”之外的任何单个字符,若要匹配包括“\n”在内的任意字符,请使用诸如“[.\n]”之类的模式
\ 将后面接着的字符标记为一个特殊字符或一个原义字符或一个向后引用。如“\n”匹配一个换行符,而“$”则匹配“$”
\d 匹配纯数字
\w 匹配字母或数字或下划线或汉字
\s 匹配任意的空白符
\b 匹配单词的开始或结束
{n} 重复 n 次
{n,} 重复 n 次或更多次
{n,m} 重复 n 到 m 次
[] 定义匹配的字符范围
[c] 匹配单个字符 c
[a-z] 匹配 a-z 小写字母的任意一个
[a-zA-Z0-9] 匹配所有大小写字母或数字
() 表达式的开始和结束位置
l 或运算符
location匹配概述
1、location大致可以分为三类
精准匹配 location = / {}
一般匹配 location / {}
正则匹配 location ~ / {}
(1)首先精确匹配:=
(2)其次前缀匹配:^~
(3)其次是按文件中顺序的正则匹配:或*
(4)然后匹配不带任何修饰的前缀匹配一般匹配
(5)最后是交给/通用匹配
2、location常用的匹配规则
= 进行普通字符精确匹配,也就是完全匹配
^~ 表示普通字符匹配。使用前缀匹配。如果匹配成功,则不再匹配其它 location
~ 区分大小写的匹配
~* 不区分大小写的匹配
!~ 区分大小写的匹配取非
!~* 不区分大小写的匹配取非
3、Rewrite 匹配优先级
1.执⾏server块的rewrite指令
2.执⾏location匹配
3.执⾏选定的location中的rewrite
if指令
if 判断指令语法
if ( 条件判断 )
{ rewrite ... }
运算符 | 作用 |
---|---|
=或!= | 直接比较变量和内容 |
~ | 区分大小写正则表达式匹配 |
!~ | 区分大小写的正则表达式不匹配 |
-f和!-f | 用来判断文件是否存在 |
-d和!-d | 用来判断目录是否存在 |
-e和!-e | 用来判断文件或目录是否存在 |
-x和!-x | 用来判断文件是否可执行 |
nginx以及if 判断可使用的全局变量
变量名 | 说明 |
---|---|
$args | 这个变量等于请求行中的参数,同$query_string |
$content_length | 请求头中的Content-length字段 |
$content_type | 请求头中的Content-Type字段 |
$document_root | 当前请求在root指令中指定的值 |
$host | 请求主机头字段,否则为服务器名称 |
$http_user_agent | 客户端agent信息 |
$http_cookie | 客户端cookie信息 |
$limit_rate | 这个变量可以限制连接速率 |
$request_method | 客户端请求的动作,通常为GET或POST |
$remote_addr | 客户端的IP地址 |
$remote_port | 客户端的端口 |
$remote_use | r 已经经过Auth Basic Module验证的用户名 |
$request_filename | 当前请求的文件路径,由root或alias指令与URI请求生成 |
$scheme | HTTP方法(如http,https) |
$server_protocol | 请求使用的协议,通常是HTTP/1.0或HTTP/1.1 |
$server_addr | 服务器地址,在完成一次系统调用后可以确定这个值 |
$server_name | 服务器名称 |
$server_port | 请求到达服务器的端口号 |
$request_uri | 包含请求参数的原始URI,不包含主机名,如:”/foo/bar.php?arg=baz” |
$uri | 不带请求参数的当前URI,$uri不包含主机名,如”/foo/bar.html” |
$document_uri | 与$uri相同例 |
if 语法实例
例1 :
# http://kgc.com/ ==> http://jd.com
location /a {
root html;
if ($host ~* kgc.com ) {
rewrite .* http://jd.com permanent;
}
}
可以看到访问京东的页面
set命令
set 指令是用于定义一个变量,并且赋值
set $user $1
return指令
return 指令用于返回状态码给客户端
# 如果访问的.sh结尾的文件则返回403操作拒绝错误
location ~* \.sh$ {
return 403;
}