1.标题浏览器访问https服务,登录超时浏览器控制台报错如下
Mixed Content: The page at 'https://192.1.1.1/index#/poc/user' was loaded over HTTPS, but requested an insecure form action 'http://192.1.1.1/login?kickout=1'. This request has been blocked; the content must be served over HTTPS.
2.场景分析
服务部署架构为后台一个java的单体应用,上层通过nginx反向代理这个单体应用,浏览器访问https请求,请求先到nginx,nginx将https请求代理到java的http单体应用服务,当应用判断登录超时会响应一个http的301重定向到登录页,nginx反向代理返回给浏览器的也是http的重定向请求,浏览器因为安全原因不允许将https的访问重定向到http,导致登录超时跳转登陆页面失败。
3.解决方案
当使用 Nginx 作为反向代理服务器时,可以通过修改 Nginx 的配置文件来确保重定向 URL 是 HTTPS 的。示例如下:
假设你有一个 HTTP 服务运行在本地的 8080 端口上,而 Nginx 通过 HTTPS 监听在 443 端口上,并将请求代理到 HTTP 服务。你想要确保当 HTTP 服务返回重定向时,重定向的 URL 是 HTTPS 的。
首先,打开 Nginx 的配置文件,通常位于 /etc/nginx/nginx.conf 或 /etc/nginx/sites-available/default,根据你的具体配置而定。
然后,在 Nginx 的配置文件中找到你的 HTTPS 服务器段(server block),在其中添加以下配置:
server {
listen 443 ssl;
server_name yourdomain.com;
ssl_certificate /path/to/your/certificate.crt;
ssl_certificate_key /path/to/your/private.key;
location / {
proxy_pass http://localhost:8080;
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 https;
proxy_set_header X-Forwarded-Port 443;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "upgrade";
}
}
在这个配置中,关键的一点是确保 proxy_set_header X-Forwarded-Proto https;
,它告诉后端服务器(HTTP 服务)请求是通过 HTTPS 发起的。这样,当 HTTP 服务返回重定向时,它会使用 HTTPS。
完成配置后,重新加载 Nginx 配置使其生效:
sudo nginx -s reload
现在,当 HTTPS 页面访问 HTTP 服务并触发重定向时,重定向的 URL 将是 HTTPS 的,而不是 HTTP 的,从而解决了浏览器报错的问题。