nginx配置系列(六)if和return以及set指令

一、if指令

语法:if(condition){…}

上下文区块段:server、location


该指令用于检查condition条件是否符合,如果condition条件符合,则执行大括号内的语句。if指令不支持嵌套,不支持多个条件 && 和 || 处理。其中,condition中可以包含的判断标识如下:

  • 变量名  如果变量值为空或者是以“0”开始的字符串,则条件为假

  • 使用"="和"!="运算符比较变量和字符串

  • ~ 用来区分大小写匹配

  • ~* 用来不区分大小写匹配

  • -f和!-f 用来判断是否存在文件

  • -d和!-d 用来判断是否存在目录

  • -e和!-e 用来判断是否存在文件或目录或符号链接

  • -x和!-x 用来判断文件是否可执行


用法示例:

#示例1
#如果客户端是手机 则跳转到test.css3er.com
if ($http_user_agent~*(mobile|nokia|iphone|ipad|android|samsung|htc|blackberry)) {
	rewrite ^(.*) http://test.css3er.com$1 permanent;
}


#示例2
if ($request_method = POST) {
     return 405;
 }

二、return指令

语法:return code [text]

return code URL;

return URL;

上下文区块段:server、location、if


该指令用于结束规则的执行并返回状态码给客户端。


状态码包括:

204(No Content)、400(Bad Request)、402(Payment Required)、403(Forbidden)

404(Not Found)、405(Method Not Allowed)、406(Not Acceptable)

408(Request Timeout)、410(Gone)、411(Length Required)

413(Request Entity Too Large)、416(Requested Range Not Satisfiable)

500(Internal Server Error)、501(Not Implemented)、502(Bad Gateway)

503(Service Unavailable)和504(Gateway Timeout)。


简单用法示例如果访问的URL以.sh .bash 结尾,则返回状态码403

location ~ .*\.(sh|bash)?$
{
	return  403;
}


注意:return指令一般用于对请求的客户端直接返回响应状态码。在该作用域内return后面的所有nginx配置都是无效的。 可以使用在server、location以及if配置中。 除了支持跟状态码,还可以跟字符串或者url链接,return指令谨慎使用,稍不注意就会导致nginx的配置没有生效等之类的错误


return指令 直接返回状态码示例

#示例1
server{
    listen 80;
    server_name www.test.com;
    return 403;
    rewrite /(.*) /abc/$1;  #该行配置不会被执行。
}


#示例2
server {
.....

if ($request_uri ~ "\.htpasswd|\.bak")
{
    return 404;
    rewrite /(.*) /aaa.txt;  #该行配置不会被执行。
}
  #如果下面还有其他配置,会被执行。
  .....
}


return指令 返回字符串示例

#示例3
server {
    listen 80;
    server_name www.test.com;
    return 200 "hello";
}
#说明:如果要想返回字符串,必须要加上状态码,否则会报错。


#示例4,直接返回json数据
location ^~ /domain {
    default_type application/json ;
    return 200  '{"name":"zack","id":"1"}';
}


#return后面也支持写一个变量
#示例5
location /test {
    return 200 "$host $request_uri";
}


return指令 返回URL示例:

#示例6
server{
    listen 80;
    server_name www.css3er.com;
    return https://www.css3er.com/p/206.html;
    rewrite /(.*) /abc/$1;  #该行配置不会被执行。
}

#注意:return后面的url必须是以http://或者https://开头的。


return指令实战示例:

#背景:网站被黑了,凡是在百度点击到本网站的请求,全部都跳转到了一个赌博的网站。
#通过nginx解决:

if ($http_referer ~ 'baidu.com') 
{
    return 200 "<html><script>window.location.href='//$host$request_uri';</script></html>";
}

#如果写成:
return http://$host$request_uri; #在浏览器中会提示“重定向的次数过多”,因为会被反复跳转。

三、set指令

语法:set variable value;

默认值:none

上下文区块段:server、location、if

说明:定义一个变量并赋值,值可以是文本,变量或者文本变量混合体。


以前总是觉得会把事情做错而不是考虑会把事情做好    -->斯宾塞·约翰逊【谁动了我的奶酪】



声明:禁止任何非法用途使用,凡因违规使用而引起的任何法律纠纷,本站概不负责。

扫码支持
扫码打赏,你说多少就多少

打开支付宝扫一扫,即可进行扫码打赏哦

精彩评论

全部回复12人评论7,777人参与