遇到的问题如下:
nginx代理端口 1443 -> 9001
访问: localhost:9001/index.html
会重定向到 localhost:9001/login.html 没问题,因为没有登录。
但是访问: localhost:1443/index.html
会重定向到 localhost/login.html
这个重定向的端口不见了。为什么呢?
经过修改Nginx配置,始终无效,验证发现是后端Java程序在生成重定向URL时没有考虑到前端代理的端口(springboot默认)。
Java应用程序在处理重定向时通常会基于请求头信息生成重定向URL。
如果Nginx代理没有正确传递或修改这些请求头,后端应用程序生成的URL可能会不包含端口号。
解决办法如下:
Nginx配置:
server {
listen 1443;
location / {
proxy_pass http://localhost:9001;
proxy_set_header Host $host:$server_port;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
proxy_set_header X-Forwarded-Host $host;
proxy_set_header X-Forwarded-Port $server_port;
proxy_set_header X-Real-IP $remote_addr;
}
}
Spring配置:
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.filter.ForwardedHeaderFilter;
@Configuration
public class WebConfig {
@Bean
public ForwardedHeaderFilter forwardedHeaderFilter() {
return new ForwardedHeaderFilter();
}
}
通过使用ForwardedHeaderFilter
,Spring会自动处理X-Forwarded-*
头信息,生成正确的重定向URL。
总结
如果Nginx配置无法解决端口丢失的问题,检查和修改后端Java程序的重定向逻辑,以确保生成的URL包含正确的端口号。这可以通过手动构建URL、使用X-Forwarded-*
头信息或使用Spring的ForwardedHeaderFilter
来实现。