使用map指令
http {
map $uri $cleaned_path {
default $uri;
"~^/websocket/(.*)" /$1; # 移除/websocket/前缀
}
map $args $filtered_args {
default $args;
"~^((?:[^&]*&)*)(appToken=[^&]*|userToken=[^&]*)(?:&|$)(.*)$" $1$3; //处理appToken和userToken
}
map $filtered_args $filtered_args2{
default $filtered_args;
"~^((?:[^&]*&)*)(appToken=[^&]*|userToken=[^&]*)(?:&|$)(.*)$" $1$3;//处理appToken和userToken
}
map $filtered_args2 $filtered_args3 {
default $filtered_args2;
"~(.*)&$" "$1"; # 移除结尾的 &
}
......其他配置,略
server {
location /websocket/ {
....原配置不要删除,只改下面的porxy_pass
proxy_pass http://backup$cleaned_path$is_args$filtered_args3;
....原配置不要删除
}
}
使用if…set指令–【推荐】
server下的location里面写,更简单高效,因为这两个参数都是不同的值,没有复用的可能
location /websocket/ {
set $path_tmp ${uri};
set $args_tmp ${args};
if ( $path_tmp ~* ^/websocket/(.*)$){
set $path_tmp /$1; #path部分去掉websocket;
}
if ( $args_tmp ~* ^(.*)(&appToken=\w*)(.*)$){
set $args_tmp $1$3; #参数去掉appToken;
}
if ( $args_tmp ~* ^(.*)(&userToken=\w*)(.*)$){
set $args_tmp $1$3; #参数去掉userToken;
}
if ( $args_tmp ~* ^&?(.*)&?$){
set $args_tmp $1; #修正剩余参数的格式,去掉头尾多余的&
}
proxy_pass http://imsconsumerCluster$path_tmp$is_args$args_tmp;
proxy_http_version 1.1;
proxy_set_header Upgrade websocket;
proxy_set_header Connection upgrade;
proxy_read_timeout 86400s;
}