概述
先附上官方文档地址:http://nginx.org/en/docs/http/ngx_http_rewrite_module.html 。
rewrite 是实现url重写以及重定向的。基于 ngx_http_rewrite_module 模块用来使用正则表达式( PCRE )改变请求的URI,返回重定向,并有条件地选择配置。
重写中用到的指令:
- if (条件) {} 设定条件,再进行重写
- set #设置变量
- return #返回状态码
- break #跳出rewrite
- rewrite #重写
break
Syntax: break;
Default: —
Context: server, location, if
停止当前 ngx_http_rewrite_module 模块指令集的执行。注意:只影响 ngx_http_rewrite_module 模块,其它模块不受影响。
if ( $request_uri ~ rewrite ) {
break;
rewrite /rewrite/(.*) http://www.$1.com;
return 200 "ok";
}
if 指令
Syntax: if (condition) { ... }
Default: —
Context: server, location
if 判断条件
- 一个变量名 ,如果变量值位空字符串或者 "0" ( 在1.1 版本之前,任何"0" 起始的字符串都被认为是false )
- 变量与一个字符串的比较 相等为(=) 不相等为(!=)
- 使用“~”(用于区分大小写的匹配)和“~*”(用于不区分大小写的匹配)运算符对正则表达式进行变量匹配。正则表达式可以包含捕获,可重用在$1...$9中。”!~”和“!~*”也可用。如果正则表达式包含“}”或“;”字符,则整个表达式应该用单引号或双引号括起来。
- 检查文件存在与否 使用-f ( 存在 ) ,!-f ( 不存在 )
- 检查文件存在与否 使用-d ( 存在 ) ,!-d ( 不存在 )
- 检查文件、目录、符号链接存在与否 使用-e ( 存在 ),!-e ( 不存在 )
- 检查是否为可执行文件 使用-x ( 存在 ),!-x ( 不存在 )
以上大多来自 个人蹩脚的翻译,可参考官方文档: http://nginx.org/en/docs/http/ngx_http_rewrite_module.html
案例:
禁止 firefox 访问 ( ~* 不去分大小写 )
if ( $http_user_agent ~* firefox){
return 404 ;
}
可以用作 if 判断的全局变量有:
注: 以上全局变量在 nginx 配置目录( conf ) 下 ,fastcgi.conf 文件中。
return 指令
Syntax: return code [text];
return code URL;
return URL;
Default: —
Context: server, location, if
停止处理并将指定的code码返回给客户端。 非标准code码 444 关闭连接而不发送响应报头。
从0.8.42版本开始, return 语句可以指定重定向 url (状态码可以为如下几种 301,302,303,307 和 308),也可以为其他状态码指定响应的文本内容,响应体和重定向url 可以包含变量 。 有一种特殊情况,就是重定向的url可以指定为此服务器本地的urI,这样的话,nginx会依据请求的协议$scheme, server_name_in_redirect 和 port_in_redirect 自动生成完整的 url 。
此外,可以将代码302用于临时重定向的URL指定为惟一参数。这样的参数应该 以“http://”、“https://”或“$scheme”字符串开始。URL可以包含变量。
案例:
当请求url 中带有zhang 时,重定向到 http://www.guopingzhang.top
if ( $request_uri ~* zhang ){
return 302 http://www.guopingzhang.top;
}
rewrite 指令
Syntax: rewrite regex replacement [flag];
Default: —
Context: server, location, if
指定的正则表达式regex来匹配请求的urI成功,则使用replacement更改URI。rewrite指令按照它们在配置文件中出现的顺序执行。可以使用flag标志来终止指令的进一步处理。如果替换字符串replacement以http://,https://或$ scheme开头,则停止处理后续内容,并直接重定向返回给客户端。
flag 选项参数有如下:
- last -- 停止处理当前的ngx_http_rewrite_module的指令集,并开始搜索与更改后的URI相匹配的location;
- break -- 与break指令一样,停止处理ngx_http_rewrite_module的当前指令集;
- redirect -- 返回一个带有302代码的临时重定向;用于替换字符串不以“http://”、“https://”或“$scheme”开头( 原文: returns a temporary redirect with the 302 code; used if a replacement string does not start with “http://”, “https://”, or “$scheme”; )
- permanent -- 返回一个301 永久重定向
案例:
带 http :
if ( $request_uri ~ rewrite ) {
rewrite /rewrite/(.*) http://www.$1.com;
return 200 "ok";
}
重定向到 了 rewrite 指定的url
不带 http :
if ( $request_uri ~ test ) {
rewrite /test/(.*) www.$1.com ;
return 200 "ok";
}
只是简单重写,并没有重定向。
在浏览器访问效果如下:
rewrite_log
Syntax: rewrite_log on | off;
Default:
rewrite_log off;
Context: http, server, location, if
启用或禁用 ngx_http_rewrite_module 模块指令将处理结果以 notice 级别存入到 nginx 的 error_log 中。默认关闭。
set 指令
Syntax: set $variable value;
Default: —
Context: server, location, if
给指定的变量设置值,值可以为文本,变量或者他们的组合。
案例:
if ( $request_uri ~* set ) {
set $qs $query_string;
return 200 "ok query string : $qs rn";
}
[root@localhost guopingzhang.top]# curl -i 127.0.0.1/set?hello
HTTP/1.1 200 OK
Server: nginx/1.14.2
Date: Fri, 05 Apr 2019 06:59:59 GMT
Content-Type: application/octet-stream
Content-Length: 26
Connection: keep-alive
ok query string : hello
[root@localhost guopingzhang.top]#
最后
以上就是搞怪洋葱为你收集整理的nginx rewrite 语法的全部内容,希望文章能够帮你解决nginx rewrite 语法所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
发表评论 取消回复