Nginx配置URL重定向和反向代理相关语法

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;
}
posted @ 2022-06-13 02:12  Layzer  阅读(397)  评论(0编辑  收藏  举报