nginx实现https自动化路由与转发的核心是先正确启用https服务,再基于路径、域名或内容特征智能分发;需配置合法证书、443端口ssl监听、http跳转,并利用location匹配与proxy_pass实现免人工分流,支持https→http协议转换及第三方资源透明代理。

HTTPS 基础配置必须到位
没有有效的 HTTPS,后续所有转发都无从谈起。你需要:
- 准备一对合法证书(如 Let's Encrypt 免费证书,或阿里云/腾讯云申请的 PEM+KEY 文件)
- 在 server 块中监听 443 端口并启用 ssl:listen 443 ssl;
- 指定证书路径:ssl_certificate 和 ssl_certificate_key
- 强制 HTTP 跳转 HTTPS(可选但推荐):return 301 https://$host$request_uri; 放在 listen 80 的 server 块里
基于 URL 路径的自动化路由(最常用)
利用 location 块匹配请求路径前缀或正则,实现免人工干预的分流:
-
前缀匹配:如
location /api/v1/users/ { proxy_pass https://users-svc/; }—— 注意末尾斜杠,表示去掉/api/v1/users/后再拼接后端路径 -
正则匹配:如
location ~ ^/api/v2/(products|categories)/ { proxy_pass https://catalog-svc/$1/; }—— 使用捕获组重写目标路径 -
避免重复路径:proxy_pass 后带
/会剥离匹配部分;不带则原样转发,容易造成双重复路径(如/api/v1//users)
转发到 HTTP 后端服务(HTTPS→HTTP)
很多内部服务仍跑在 HTTP 上,Nginx 可以安全地对外提供 HTTPS,对内走 HTTP:
- 直接写
proxy_pass http://10.0.0.5:8080/;即可,Nginx 自动完成协议转换 - 务必添加关键头信息:proxy_set_header Host $host;、proxy_set_header X-Real-IP $remote_addr;、proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
- 若遇
Permission denied错误,检查 SELinux 是否限制网络连接:setsebool -P httpd_can_network_connect 1
针对第三方资源的透明代理(规避证书警告)
当页面引用了带自签名证书或 IP 地址的 HTTPS 外部资源(如 https://192.168.1.100:8001/file/xxx),浏览器会拦截。解决方案是让 Nginx 替你访问,并暴露为本地可信路径:
- 前端把原始外链改成相对路径,如
/thirdparty/file/xxx - Nginx 配置:
location /thirdparty/ { proxy_pass https://192.168.1.100:8001/; } - 这样浏览器只跟你的域名通信,SSL 由你控制,外部证书问题被隔离











