我是靠谱客的博主 搞怪洋葱,最近开发中收集的这篇文章主要介绍nginx rewrite 语法,觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

先附上官方文档地址: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 语法所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(40)

评论列表共有 0 条评论

立即
投稿
返回
顶部