项目场景:
新系统上线,由于生产环境域名有限,分配域名时添加一层路径用于F5请求拦截分发。
使用中间件:
web: Nginx ----> 主要用于请求转发,不做负载均衡策略。
应用:tomcat-9.0.36 --->处理业务逻辑
问题描述:
nginx 发送ajax请求时无法正确通讯
设定线上访问路径为: https://dev.test.com/cpp-test-project/page/index.html
上线时实际访问路径为: https://dev.test.com/cpp/cpp-test-project/page/index.html
原因分析:
由于申请机器以及域名时,未曾考虑到域名后会多一层路径。导致nginx的服务转发路径与实际应用路径不一致。
应用层的访问路径原本为 /cpp-test-project/test/test.do
实际部署后前台访问路径为: /cpp/cpp-test/project/test/test.do
解决方案:
修改nginx配置文件,对请求路径中的多余路径层级进行过滤
原请求转发配置:
location ~ \.do$ {
proxy_pass http://158.220.111.222
......
}
表示拦截所有以.do结尾的请求,并转发到 158.220.111.222服务器上。
修改为如下配置
location /cpp {
proxy_pass http://ip<实际配置的转发请求ip>/;
.....
}
在转发请求路径 http://ip 后添加 /表示 以 / 替换拦截 的 /cpp路径。
可以达到正确转发请求的效果。
修改后经过测试发现。 由于转发路径拦截导致请求的session 与返回session路径不一致
对于需要校验会话或者获取会话信息的交易, 后台服务器获取不到正确的会话信息。
经过查询资料,了解该情况原因为: nginx服务转发过滤路径后,导致原web端生成的请求session对应路径与后台服务生成的响应session路径不一致。
解决方案:
在nginx配置中添加cookie路径转换的配置
location /cpp {
proxy_pass http://ip<实际配置的转发请求ip>/;
proxy_cookie_path / /cpp/; 将 /路径对应到 /cpp/上
.....
}
添加如上配置后,请求可以正常发送,登录等校验会话请求也正常。
注意:
1、nginx配置 location 拦截请求过滤路径时,不能与正则表达同步使用。
location ~ /cpp/+.\.do {
proxy_pass http://ip/; 此时最后的/不能添加。
.....
}