1:重定向
正则表达式匹配:
1:~ 为区分大小写匹配
2:~* 为不区分大小写匹配
3:!~和!~*分别为区分大小写不匹配及不区分大小写不匹配
文件及目录匹配:
1:-f和!-f用来判断是否存在文件
2:-d和!-d用来判断是否存在目录
3:-e和!-e用来判断是否存在文件或目录
4:-x和!-x用来判断文件是否可执行
flag标记:
1:last 相当于Apache里的[L]标记,表示完成rewrite
2:break 终止匹配, 不再匹配后面的规则
3:redirect 返回302临时重定向 地址栏会显示跳转后的地址
4:permanent 返回301永久重定向 地址栏会显示跳转后的地址
可用的全局变量有,可以用做条件判断:
1:$args # 请求中的参数
2:$content_length # HTTP请求信息里的"Content-Length"
3:$content_type # 请求信息里的"Content-Type"
4:$document_root # 针对当前请求的根路径设置值
5:$documenturi # 与uri相同
6:$host # 请求信息中的"Host",如果请求中没有Host行,则等于设置的服务器名
7:$limit_rate # 对连接速率的限制
8:$request_method # 请求的方法,比如"GET"、"POST"等
9:$remote_addr # 客户端地址
10:$remote_port # 客户端端口号
11:$remote_user # 客户端用户名,认证用
12:$request_filename # 当前请求的文件路径名
13:$request_body_file
14:$request_uri # 请求的URI,带查询字符串
15:querystring # 与args相同
16:scheme # 所用的协议,比如http或者https,比如rewrite(.+)
scheme://kubernetes-devops.cn 1 redirect;
17:$server_protocol # 请求的协议版本,"HTTP/1.0"或"HTTP/1.1"
18:$server_addr # 服务器地址,如果没有用listen指明服务器地址,使用这个变量将发起一次系统调用以取得地址(造成资源浪费)
19:$server_name # 请求到达的服务器名
20:$server_port # 请求到达的服务器端口号
21:$uri # 请求的URI,可能和最初的值有不同,比如经过重定向之类的
return指令:
# 该指令用于结束规则的执行并返回状态码给客户端
# 可使用server, location, if 区域
示例:如果访问的URL以".sh"或".bash"结尾,则返回403状态码
location ~ .*.(sh|bash)?$ {
return 403;
}
rewrite 指令:
# 使用nginx提供的全局变量或自己设置的变量,结合正则表达式和标志位实现url重写以及重定向
可以使用在 server, location, if 区域
rewrite 语法格式
rewrite regex(正则) replacement flag (rewrite 源地址 目标地址)
flag: break/last/redirect/permanent:
1:last:last一般写在server和if中 停止执行其他重写规则,根据URI继续搜索其他location
2:break:break一般使用在location url重写后,直接使用当前资源,不再执行location里余下的语句,完成本次请求
3:redirect:302临时重定向,地址栏改变,爬虫不更新URI
4:permanent:301永久重定向。地址栏改变,爬虫更新URI
# 重定向案例:
server {
listen 80;
server_name web1.kubernetes-devops.cn web2.kubernetes-devops.cn;
if ($host = 'web1.kubernetes-devops.cn') {
return 201; # 这里只是测试
}
if ($host = 'web2.kubernetes-devops.cn') {
return 202; # 如上
}
}
# 测试
[root@virtual_host ~]# curl web1.kubernetes-devops.cn -I
HTTP/1.1 201 Created # 这里只看状态码即可
[root@virtual_host ~]# curl web2.kubernetes-devops.cn -I
HTTP/1.1 202 Accepted # 这里只看状态码即可
2:反向代理
反向代理:是指以代理服务器来接受internet上的连接请求,然后将请求转发给内部网络上的服务器,并将从服务器上得到的结果返回给internet上请求连接的客户端,此时代理服务器对外就表现为一个服务器 proxy_pass
可使用字段:location, location中的if字段
# 这个指令设置被代理服务器的地址和被映射的URI,地址可以使用主机名或IP加端口号的形式,例如:
proxy_pass http://kubernetes-devops.cn;
# proxy_pass 也可以配合upstream使用
location {
proxy_pass http://kubernetes-devops.cn;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto https;
proxy_next_upstream off;
proxy_connect_timeout 30;
proxy_read_timeout 300;
proxy_send_timeout 300;
}
# 集合upsteam
upstream cluster {
server 10.0.0.10:8080;
server 10.0.0.11:8080;
}
server {
listen 80;
server_name tomcat.kubernetes-devops.cn;
proxy_pass http://cluster;
}