【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;