Nginx使用rewrite重写url
作者:温新
时间:2021-03-02
rewrite语法
rewrite regex replacement [flag];
# 关键字 正则 替代内容 flag标记
默认值:none
应用位置:server、location、if
flag标记有如下几个选项:
flag | 含义 |
---|---|
last | 本条规则匹配完成后,继续向下匹配新的location url规则 |
break | 本条规则匹配完成后立即终止,不再向后匹配任何规则 |
redirect | 302临时重定向,浏览器地址会显示跳转后的url地址 |
permanent | 301永久重定向,浏览器地址栏会显示跳转后的url地址 |
案例
# 将所有访问永久重定向到 www.ziruchu.com
rewrite ^/(.*) https://www.ziruchu.com permanent;
应用场景
1)url静态化,利于被搜索引擎收录,用户体验更好
2)网站域名更换
常用正则表达式
字符 | 含义 |
---|---|
\ | 将下一个字符标记为或特殊字符、或原义字符、或向后引用、或八进制转义符 |
^ | 匹配输入字符串的起始位置 |
$ | 匹配输入字符串的结束位置 |
* | 匹配前面的字符零次或者多次 |
+ | 匹配前面字符串一次或者多次 |
? | 匹配前面字符串的零次或者一次 |
. | 匹配除换行符 \n 之外的任何单字符 |
( ) | 标记一个子表达式的开始和结束位置 |
其他指令
if指令
语法:if ( condition ) {}
功能:条件判断。
参数:condition判断条件为 true/false。condition有如下几个判断条件:
1、变量名。若变量值为空字符串或以“0”开头的任意字符,if指令默认为false;
if ($name) { }
**2、=或!=**比较变量和字符串是否相等,相等为true,否则为false
if ($request_method == POST) { }
注意:字符串(POST)不需要加引号
3、使用正则对变量进行匹配,成功为true,否则为false
变量与正则表达式之间使用~、~*、!~、!~*
连接。~
表示大小写敏感,~*
大小写不敏感,!~/~!~*
匹配失败时为true,否则为false。
if ($http_user_agent ~ MSIE) {
# $http_user_agent的值中是否包含MSIE字符串,若有则返回true
}
4、-f或!-f判断请求文件是否存在
if (-f $request_filename) {
# 判断请求文件是否存在
}
if (!-f $request_filename) {
# 判断请求文件是否不存在
}
5、-d或!-d 判断请求的目录是否存在
为-d
时,请求为目录,返回true,否则为false;
为!-d
时,若请求的目录不存在,但该目录存在上级目录,返回true;若该目录和上级目录都不存在,返回false;若请求的目录存在,返回false。
6、-e 或 !-e 判断文件或目录是否存在
为-e
时,若请求的目录或文件存在,则返回true,否则为false;
为!-e
时,若请求的文件和所在路径上的目录都不存在,返回true,否则返回false。
7、-x 或 !-x 判断文件是否可执行
为-x
时,若请求文件可执行,返回true;
为!-x
时,若请求文件不可执行,返回true。
break指令
语法:break
功能:结束该层的匹配
使用范围:使用在server块和location块以及if块
案例:
server {
location / {
if ($slow) {
set $id $s1;
break; # 中断 if 块之后的指令
limit_rate 10k; # 该指令不会生效
}
# 此处,对于其他指令依旧生效
}
}
return指令
语法:
# 方式一
return [text]
# 方式二
return code URL;
# 方式三
return URL;
功能:用于完成对请求的处理,直接向客户端返回响应状态代码。处于该指令后的所有nginx配置都是无效的。
使用范围:server location if
参数:
text,返回给客户端的内容;
code,返回给客户端HTTP状态码;
URL,返回客户端的url地址。
rewrite_log
语法:rewrite_log on | off
功能:是否开启URL重写日志的输出功能。默认为off。
说明:URL重写的相关日志将以notice级别输出到error_log指令配置的日志文件中。
set
语法:set $variable value
功能:用于设置一个新变量
参数:
variable,为变量名;
value:变量值
案例:set $age 19
uninitialized_variable_warn
语法:uninitialized_variable_warn on | off
功能:用于设置配置使用未初始化的变量时,是否记录警告日志。默认为on。
rewrite常用全局变量
变量 | 说明 |
---|---|
$args | 变量中存放请求URL中的请求指令。如a.com/a?a=1&b=2中的a=1&b=2的部分 |
$content_length | 变量中存放请求头中的Content-length字段 |
$content_type | 请求头中的Content-type字段 |
$document_root | 当前请求的根路径 |
$document_uri | 当前请求uri,如http://www.a.com/art?a=1中的/art |
$host | 请求url中的主机部分,https://www.zifuchu.com中的www.ziruchu.com |
$http_user_agent | 客户端的代理信息 |
$http_cookie | 客户端的cookie信息 |
$limit_rate | nginx服务器对网络连接速率的限制 |
$remote_addr | 客户端IP |
$remoet_port | 客户端端口 |
$remote_user | 客户端用户名 |
$request_body_file | 本地文件资源名称 |
$request_method | 请求方法,如GET、POST |
$request_filename | 当前请求的资源文件的路径名 |
$request_uri | 当前请求uri并携带请求指令 |
$query_string | 请求参数 |
$scheme | 客户端请求协议,如http、https、ftp |
$server_protocol | 客户端请求协议版本,如http/1.0,http/1.1 |
$server_addr | 服务器地址 |
$server_name | 服务器名称 |
$server_port | 服务器端口号 |
$uri | 与$document_uri相同 |
rewrite重定向案例
将所有请求重定向到指定地址
rewrite ^/ https://www.ziruchu.com;
带路径重定向
server {
listen 192.168.133.128:8080;
location / {
if ($host ~ :8080/demo01/) {
rewrite ^(.*) https://www.test.com$1 permanent;
}
}
}
当案例中,当访问192.168.133.128:8080/demo01
会重定向到https://www.test.com/demo01
url伪静态化
server {
root /www/demo01;
listen 192.168.133.128:8080;
location ^~ /art {
rewrite /art-(\d+)\.htm /art/$1.html permanent;
break;
}
}
当访问192.168.133.128:8080/art-11.html
时会重定向到192.168.133.128:8080/art/11.html
我是温新
每天进步一点点,就一点点