我有以下配置。但是,当用户从 http 切换到 https 时,会话不再保留。例如,主页是 http,但付款页面是 https。
我该如何解决这个问题?
upstream backend {
ip_hash;
server <server-1-ip>;
server <server-2-ip>;
}
upstream backend_ssl {
ip_hash;
server <server-1-ip>:443;
server <server-2-ip>:443;
}
server {
location / {
proxy_pass http://backend;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
}
}
server {
listen 443 ssl;
ssl_certificate /etc/nginx/ssl/mycert.crt;
ssl_certificate_key /etc/nginx/ssl/mykey.key;
location / {
proxy_pass https://backend_ssl;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
}
}
答案1
嗯,我猜是因为您使用了两个upstream
组,所以状态不会在两个组之间共享。目前我无法进一步测试这一点,但以下是我的一些想法:
使用一
upstream
组,检查$scheme
,杠杆地图$scheme
使用变量来为(http 或 https)分配正确的端口,并在您的server
指令中使用此变量,因此这变成server <server-1-ip>:$variable
。使用区它“保留了工作进程之间共享的组的配置和运行时状态。多个组可能共享同一个区域。”
除了使用 之外
ip_hash
,您还可以使用以下方法插入包含正确后端服务器的 cookie(该服务器将用于所有后续请求)黏。
注意:这不是一个复制粘贴的万能答案,只是我的一些想法。阅读文档,你会找到解决方案。祝你好运,一切顺利!