第一步:确认Nginx侧配置正常
首先先贴nginx配置
server {
listen 18443 ssl;
server_name 你的域名;
client_max_body_size 200M;
ssl_certificate "cert/你的域名.crt";
ssl_certificate_key "cert/你的域名.key";
ssl_session_timeout 5m;
ssl_protocols TLSv1 TLSv1.1 TLSv1.2;#请按照这个协议配置
ssl_ciphers ECDHE-RSA-AES128-GCM-SHA256:HIGH:!aNULL:!MD5:!RC4:!DHE;#请按照这个套件配置,配置加密套件,写法遵循 openssl 标准。
ssl_prefer_server_ciphers on;
location / {
error_log logs/你的域名-ssl.error-$logdate.log error;
access_log logs/你的域名-ssl.access-$date_time.log main;
index index.jsp index.html index.htm;
# 允许的源(根据您的需求调整,* 表示允许所有来源)
add_header 'Access-Control-Allow-Origin' '*';
# 允许的请求方法
add_header 'Access-Control-Allow-Methods' 'GET, POST, OPTIONS, PUT, DELETE';
# 允许的请求头部
add_header 'Access-Control-Allow-Headers' 'DNT,User-Agent,X-Requested-With,If-Modified-Since,Cache-Control,Content-Type,Range,Authorization';
# 允许暴露的头部
add_header 'Access-Control-Expose-Headers' 'Content-Length,Content-Range';
# 如果是预检请求(OPTIONS),直接返回204
if ($request_method = 'OPTIONS') {
add_header 'Access-Control-Max-Age' 1728000;
add_header 'Content-Type' 'text/plain; charset=utf-8';
add_header 'Content-Length' 0;
return 204;
}
proxy_pass http://tongweb_backend;
proxy_http_version 1.1;
proxy_set_header Connection "";
# 【关键修改 2】强制 Host 头携带 18443 端口
# $host 是域名,$server_port 是 Nginx 监听的 18443
proxy_set_header Host $host:$server_port;
# 【关键修改 3】显式传递原始端口和协议
proxy_set_header X-Forwarded-Proto $scheme;
proxy_set_header X-Forwarded-Port $server_port;
proxy_set_header X-Forwarded-Host $host:$server_port;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
}
}
作用:
proxy_pass使用http://tongweb_backend指向TongWeb本地8081端口,没有出现协议错配问题
所有location块中都配置了proxy_set_header X-Forwarded-Port $server_port;,已经将Nginx实际监听的18443端口透传给后端TongWeb。
注意:在每一层nginx 代理上,均需设置X-Forwarded-For头,将客户端IP追加到该头中,并传递X-Real-IP等。
多层代理时,X-Forwarded-For会由近及远记录各跳IP(如客户端IP,代理11P,代理2IP),最左侧通常为原始客户端IP。
第二步:修改TongWeb7的tongweb.xml补充端口解析参数
<virtual-host name="server" listeners="tong-http-listener" accesslog-enabled="true" accesslog-dir="logs/access" sso-enabled="false" remote-filter-enabled="false"
addValve="com.tongweb.catalina.valves.RemoteIpValve,internalProxies=127.0.0.1,中间相关IP逗号分隔,protocolHeader=X-Forwarded-Proto,protocolHeaderHttpsValue=https,remoteIpHeader=X-Forwarded-For,portHeader=X-Forwarded-Port">
新增自定义参数说明:
internalProxies:把全链路中所有中间代理的IP全部标记为信任IP,包括本机环回127.0.0.1、Nginx所在内网IP、映射规则节点IP,以及IPv6本地环回,只有来自这些信任IP的请求,TongWeb才会解析X-Forwarded-For头中的真实客户端公网IP。
补充protocolHeaderHttpsValue=https:确保HTTPS协议标识的识别逻辑完整。
补充portHeader=X-Forwarded-Port:同时保留18443端口的正确透传能力,避免修改后端口识别重新变回443。
测试 JSP:
访问页面,查看 basePath。
此时 request.getScheme() 应为 https(由 X-Forwarded-Proto 决定)。
request.getServerName() 应为 zhjg.gdagri.gov.cn。
request.getServerPort() 应为 18443(由 X-Forwarded-Port 决定,经 RemoteIpValve 解析后生效)。