Nginx根据请求头进行请求的转发

【1】根据请求头的值进行转

nginx中可以通过$http_加上请求头的名字(注意是小写哦)来获取对应请求头的值,如果存在且符合某种规则,就可以实现请求的转发。

location / {
    if ($http_user_agent ~* "iPhone") {
        proxy_pass http://backend-server1;
    }
    
    if ($http_referer ~* "example.com") {
        proxy_pass http://backend-server2;
    }
}

上述配置会根据客户端的User Agent(通过$http_user_agent获取)或Referer(通过$http_referer获取)来判断应该向哪个后端服务器转发请求。

~*:用于表示 uri 包含正则表达式,并且不区分大小写,即看到~就表示正则表达式。

如下所示拦截 /user/XXXX请求,如果请求头携带了jane-version=1.1.0,则代理到8081,否则代理到8082。

这里需要说明的 是在nginx的location配置中,在获取header配置时,须要在header名称前面加上固定前缀“http_“,并将header名称中的“-”中划线变为下划线。如果想要自定义请求头,那么使用 - 而不是 _

location ~ (/user/).*$  {
	if ($http_jane_version = "1.1.0") {
		proxy_pass   http://localhost:8081;
		break;
	}
	
	if ($http_jane_version = "") {
		proxy_pass   http://localhost:8082;
	}
}

需要注意的是,如果location或者if里面使用了正则,那么proxy_pass中不能携带uri(只能是ip:port)。

【2】NGINX启动停止

start nginx : 启动nginx
nginx -s reload  :修改配置后重新加载生效
nginx -s reopen  :重新打开日志文件
nginx -t -c nginx.conf 测试nginx配置文件是否正确
nginx -s stop  :快速停止nginx
nginx -s quit  :完整有序的停止nginx

【3】如何在日志打印某个请求头?

如下所示自定义日志格式并应用于access_log:

log_format  main  '$remote_addr - $remote_user [$time_local] "$request" - jane_version "$http_jane_version"'
                   '$status $body_bytes_sent "$http_referer" '
                   '"$http_user_agent" "$http_x_forwarded_for"';

 access_log  logs/access.log  main;
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

流烟默

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值