![监听上游负载均衡器时,Nginx http 到 https 重定向不起作用](https://linux22.com/image/729939/%E7%9B%91%E5%90%AC%E4%B8%8A%E6%B8%B8%E8%B4%9F%E8%BD%BD%E5%9D%87%E8%A1%A1%E5%99%A8%E6%97%B6%EF%BC%8CNginx%20http%20%E5%88%B0%20https%20%E9%87%8D%E5%AE%9A%E5%90%91%E4%B8%8D%E8%B5%B7%E4%BD%9C%E7%94%A8.png)
我目前有一个 HAProxy 负载均衡器,没有 SSL 终止,它将流量路由到几个 Web 服务器。在 Web 服务器上,nginx 终止 SSL,理论上提供 http 到 https 的重定向。但是,当在浏览器中请求 http 时,它不会重定向,而是抛出“400 错误请求”错误,表示普通的 http 请求已发送到 https 端口。知道我在这里做错了什么吗?
nginx 配置文件示例:
server {
listen private.ip:80;
allow lb.ip;
allow secondary_lb.ip;
deny all;
server_name qa.example.com;
return 301 https://$host$request_uri;
}
server {
listen private.ip:443 ssl;
allow lb.ip;
allow secondary_lb.ip;
deny all;
server_name qa.example.com;
# rest of config
}
我相信 HAProxy 配置的相关部分是这样的(存在一些 ansible 变量,但你明白了)...
frontend http
bind my_ip:80
bind my_ip:443
option tcplog
mode tcp
default_backend app_pool
backend app_pool
mode tcp
balance roundrobin
option ssl-hello-chk
{% for server in backend_webservers %}
server {{ server.name }} {{ server.ip }}:443 check
{% endfor %}
答案1
根据您的配置,即使请求是在端口 80 上接收的 HTTP 流量,HAProxy 也会将请求路由到 443 端口。
处理此问题的最佳方法是在 HAProxy 上配置 http 到 https 的重定向,而不是在后端。因此,您必须将以下内容添加到 HAProxy 前端:
重定向方案 https 代码 301 if !{ ssl_fc }