* 假设我们需要将 nginx 作为代理,将我们自己的 https://www.test.com/listUsers 转发到 https://www.proxy.com/api?method=listUsers 这个地址,并且还需要保证参数正确

* 常见的配置如下:

server {
listen 80;
server_name www.test.com;
access_log log/nginx/www.test.com-access.log main;
error_log /log/nginx/www.test.com-error.log warn;
#解决 nginx no resolver defined to 无法解析地址的问题
resolver 8.8.8.8;
location /listUsers {
set $arg_name "?method=listUsers";
                proxy_set_header X-Forwarded-For $remote_addr;
                proxy_ssl_session_reuse off;
                proxy_ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
                proxy_ssl_server_name on;
                proxy_ssl_name $proxy_host;
                proxy_set_header Host $proxy_host;
                # 避免某些站点 禁止 http 1.0 访问,所以要设置 http 版本,非必要
                proxy_http_version 1.1;
                proxy_pass https://www.proxy.com/api$arg_name;
}
}

* 一般以上方式都能正确转发了,但如果有多个路由需要转发,我们就需要配置多条,并且转发的域名其实都是一样的,于是,我们想到可以通过定义一个转发域名变量来减少后期修改的麻烦,如: 

set $proxy_to_api www.proxy.com; 

* 然后在随后的配置中,使用变量拼接的方式来处理,如: 

proxy_pass https://$proxy_to_api/api$arg_name;

* 但这样可能出现因解析问题导致转发失败,我们配置里面的 resolver 8.8.8.8; 也没有起效,所以只能使用其他办法,示例配置如下:

server {
listen 80;
server_name www.test.com;
access_log log/nginx/www.test.com-access.log main;
error_log /log/nginx/www.test.com-error.log warn;
#解决 nginx no resolver defined to 无法解析地址的问题
resolver 8.8.8.8;
set $proxy_to_api www.proxy.com;
location /listUsers {
                set $arg_name "?method=listUsers";
                proxy_set_header X-Forwarded-For $remote_addr;
                proxy_ssl_session_reuse off;
                proxy_ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
                proxy_ssl_server_name on;
                proxy_ssl_name $proxy_host;
                proxy_set_header Host $proxy_host;
                # 避免某些站点 禁止 http 1.0 访问,所以要设置 http 版本,非必要
                proxy_http_version 1.1;
                # 使用变量拼接必须这样写,否则可能无法正常解析
                # 替换匹配到的路径为 /api$arg_name+匹配的后缀
                rewrite /listUsers/(.*) /api$arg_name$1 break;
                # 需要转换一下,否则参数拼接会有问题
                set $linkstr "";
                if ($is_args) {
                    set $linkstr "&";
                }
                proxy_pass https://$proxy_to_api/api$arg_name$1$linkstr$args;
         }
}

* 以上示例的核心部分是:

# 使用变量拼接必须这样写,否则可能无法正常解析
# 替换匹配到的路径为 /api$arg_name+匹配的后缀
rewrite /listUsers/(.*) /api$arg_name$1 break;
# 需要转换一下,否则参数拼接会有问题
set $linkstr "";
if ($is_args) {
    set $linkstr "&";
}
proxy_pass https://$proxy_to_api/api$arg_name$1$linkstr$args;

* 参考链接: 点击跳转

点赞(0) 打赏

微信小程序

微信扫一扫体验

微信公众账号

微信扫一扫加关注

发表
评论
返回
顶部