* 假设我们需要将 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;
* 参考链接: 点击跳转