场景:在内网提供 http 访问外网 https 网站资源。
内网架设 nginx http 站点,通过 http://aaa.com 供访问,nginx 收到 http 请求后,反射代理外网 https://bbb.com。
配置文件:
server{
listen 80;
server_name aaa.com;
resolver 192.168.1.1 valid=300s;
resolver_timeout 300s;
location / {
set $remotedomain "bbb.com:8383";
proxy_pass https://$remotedomain;
proxy_set_header Host $host;
proxy_redirect https:// http://;
}
}
1、proxy_set_header Host $host
加这项设置,bbb.com 可以获取到用户是通过哪个域名来访问资源的。这样,生成页面链接时,会指向 aaa.com,而不是外网的域名 bbb.com
2、proxy_redirect https:// http://
由于访问的 bbb.com 是 https 而不是 http,获取到的页面,页面中的链接很有可能是 https://aaa.com/ 而不是 http://aaa.com,若不加此项,nginx 不会处理 https 的请求,默认只处理 http 的请求。
加了此项后,nginx 会把 https://aaa.com/ 请求转向到 http://aaa.com。
3、resolver 和 set $remotedomain 变量
这是为了动态解析域名,如果 bbb.com 是静态 IP,就没必要使用这种方式,只要直接写到 proxy_pass 中即可。
resolver 192.168.1.1 指定的是 DNS 服务器地址,可以用路由器地址或公共 DNS,如:8.8.8.8
4、real_IP
由于不关心客户端实际内网 IP 地址,因此没加这些 http header 相关参数重写的选项,请按实际需求酌情设置。