重定向及基础实验
1.if指令
if (判断条件){
执行语句;
}
if的正则表达式
= #比较变量和字符串是否相等,相等时if指令认为该条件为true,反之为false
!= #比较变量和字符串是否不相等,不相等时if指令认为条件为true,反之为false
~ #区分大小写字符,可以通过正则表达式匹配,满足匹配条件为真,不满足匹配条件为假
!~ #区分大小写字符,判断是否匹配,不满足匹配条件为真,满足匹配条件为假
~* #不区分大小写字符,可以通过正则表达式匹配,满足匹配条件为真,不满足匹配条件为假
!~* #不区分大小字符,判断是否匹配,满足匹配条件为假,不满足匹配条件为真
-f 和 !-f #判断请求的文件是否存在和是否不存在
-d 和 !-d #判断请求的目录是否存在和是否不存在
-x 和 !-x #判断文件是否可执行和是否不可执行
-e 和 !-e #判断请求的文件或目录是否存在和是否不存在(包括文件,目录,软链接)
实例
location /main {index index.html;default_type text/html;if ( $scheme = http ){echo "if-----> $scheme";}if ( $scheme = https ){echo "if ----> $scheme";}
结果为,当我们使用http来访问此站点时。那么,会回复“if------>http”;当我们使用https来访问此站点时。那么,会回复“if------>https”。
server {listen 80;server_name www.kgc.com;root /usr/local/nginx/html/;location / {root /data/nginx/pc/;}location /test {default_type text/plain;return 301 https://www.baidu.com;}location /main {index index.html;default_type text/html;if ( $scheme = http ){return 666 "if-----> $scheme";}}#if (!-e $request_filename){#return 200 "$request_filename\n";#return 302 /index.html;#}
}
访问192.168.174.104/main得到的结果:
这时,我们将最后四个注释删掉,再次访问192.168.174.104/main得到的结果:
返回主站点。
或者
可以得到我们访问文件的路径
2.return
return用于完成对请求的处理,并直接向客户端返回响应状态码,比如:可以指定重定向URL(对于特殊重定向状态码,301/302等) 或者是指定提示文本内容(对于特殊状态码403/500等),处于此指令后的所有配置都将不被执行,return可以在server、if 和 location块进行配置。
location /main {index index.html;default_type text/html;#if ( $scheme = http ){return 666 "if-----> $scheme";#}}
访问结果:
日志文件:
实际应用
server {listen 80;server_name www.kgc.com;root /usr/local/nginx/html/;location /test {default_type text/plain;return 301 https://www.baidu.com;}location /main {index index.html;default_type text/html;if ( $scheme = http ){return 666 "if-----> $scheme";}}if (!-e $request_filename){#return 200 "$request_filename\n";return 302 /index.html;}
}
我们来依次翻译每一段字符的含义:
server {:定义虚拟主机,我们可以使用他来运行多个网站。
listen 80:监听在本机的80端口上。
server_name www.kgc.com:定义的域名为www.kgc.com。
root /usr/local/nginx/html/:默认的主站点所在的目录。
location /test{:如果url为test就执行括号的指令或者文件。
default_type text/plain:默认为纯文本格式。
return 301 https://www.baidu.com:输出状态码为301(永久重定向),将访问到百度。
}:location的后括号。
location /main {:另一个locatio,如果url为/main,则访问此location下。
index index.html:访问index.html文件。
default_type text/html:默认为纯文本格式。
if ( $scheme = http ){:if判断,如果判断成立,则会执行下面的语句。
return 666 "if-----> $scheme":输出状态码为666(无特殊含义),输出内容为“if----->协议”
}:if的后括号
}:location的后括号
if (!-e $request_filename){:if判断,如果判断成立,则会执行下面的语句。
#return 200 "$request_filename\n":被注释掉的代码,本来的意思为输出当前请求文件的路径,并在结尾加上换行符。
return 302 /index.html:输出状态码为302(即临时重定向),将url变为/index.html来重新匹配。
}:if的后括号
}:server的后括号
访问结果
192.168.174.104/test:已经有了缓存
由于没有访问mian的路径,会直接跳转到主站点
将最后的if判断注释掉