nginx学习笔记(4):常用6大指令函数

13

一.if指令

1.判断变量

  • 变量值是空字符串或者"0"时,判定为false;否则,判定为true

  • 使用 “=” 和 “!=” 操作符判断是否等于字符串

  • 使用 “~” 和 “!~” 操作符判断变量是否匹配正则表达式,后面再加*表示不区分大小写

if ($invalid_referer) {
    return 403;
}
if ($request_method = POST) {
    return 405;
}

2.判断路径

  • “-f”, “!-f”:判断指定的路径是否为存在且为文件;

  • “-d”, “!-d”:判断指定的路径是否为存在且为目录;

  • “-e”, “!-e”:判断指定的路径是否存在,文件或目录均可;

  • “-x”, “!-x”:判断指定路径的文件是否存在且可执行;

#判断index.html是否存在
location =/index.html {
	if (!-f "$document_root/index.html") {
	    rewrite ^(.*)$  /index2.html;
	}
}

二、rewrite指令

用于重写url

rewrite <regex> <replacement> [flag];

flag(可选):

用于指定重写的标志,影响重写操作的行为。

  • last:停止当前 location 的匹配过程,重新选择合适的 location。

  • break:停止当前 location 的匹配过程,并继续执行当前 location 中的其他指令。

  • redirect:发出一个临时的 302 重定向响应。

  • permanent:发出一个永久的 301 重定向响应。

三、set指令

用于定义变量

四、map指令

用于变量映射

map <variable> <value> {
     <condition>   <result>;
     ...     
     <default>     <result>;
   }   

- <variable>:要进行映射的变量名。
- <value>:要映射到的结果变量名。
- <condition>:条件,可以使用正则表达式或其他匹配规则。
- <result>:满足条件时映射的结果值。
- <default>:没有匹配到条件时的默认结果值。

http {
    map $http_user_agent $browser {
        default "unknown";
        ~*(MSIE) "Internet Explorer";
        ~*(Firefox) "Firefox";
        ~*(Chrome) "Google Chrome";
        ~*(Safari) "Safari";
        ~*(Opera) "Opera";
      }

    server {
        location / {
            add_header X-Browser $browser;
            # 其他配置...
        }
    }
}

五、proxy_pass指令

用于代理到指定后端

六、try_files指令

尝试不同的文件或路径

格式1:try_files file ... uri;  格式2:try_files file ... =code;

关键点1:按指定的file顺序查找存在的文件,并使用第一个找到的文件进行请求处理

关键点2:查找路径是按照给定的root或alias为根路径来查找的

关键点3:如果给出的file都没有匹配到,则重新请求最后一个参数给定的uri,就是新的location匹配

关键点4:如果是格式2,如果最后一个参数是 = 404 ,若给出的file都没有匹配到,则最后返回404的响应码

location /images/ {
    root /opt/html/;
    try_files $uri   $uri/  /images/default.gif; 
}
#请求 127.0.0.1/images/test.gif 
#会依次查找 
#1.文件/opt/html/images/test.gif   
#2.文件夹 /opt/html/images/test.gif/下的index文件 
#3. 请求127.0.0.1/images/default.gif

####注意
#1.try-files 如果不写上 $uri/,当直接访问一个目录路径时,并不会去匹配目录下的索引页  
#即 访问127.0.0.1/images/ 不会去访问  127.0.0.1/images/index.html