最近集群部署项目时遇到了这个问题,项目采用springboot框架,内嵌tomcat容器。前端采用nginx使用https以后出现的重定向(redirect)的问题。用nginx反向代理tomcat,然后把nginx配置为https访问,并且nginx与tomcat之间配置为普通的http协议,当后台代码定义时redirect,实际是重定向到了http下的地址,导致浏览器上无法访问非https的地址。
nginx配置:
由于对tomcat而言收到的是普通的http请求,因此当tomcat里的应用发生转向请求时将转向为http而非https,为此我们需要告诉tomcat已被https代理,方法是增加X-Forwared-Proto。
server {
listen 8443 ssl;
server_name manager.dong.com;
access_log /data/nginx/logs/manager.dong.com.log main;
location / {
proxy_pass http://web/;
proxy_http_version 1.1;
proxy_set_header Host $host:$server_port;
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;
proxy_connect_timeout 300;
proxy_send_timeout 300;
proxy_read_timeout 300;
}
springboot内置tomcat配置
该配置将指示tomcat从HTTP头信息中去获取协议信息,而非从HttpServletRequest中获取
server:
tomcat:
uri-encoding: utf-8
remote_ip_header: x-forwarded-for
protocol_header: x-forwarded-proto
port-header: X-Forwarded-Port
use-forward-headers: true
port: 8722
context-path: /officeService
spring:
mybatis:
mapperLocations: classpath:**/ibatis-config/*.xml