遇到这样的问题,先描述一下:
- 有一个spring mvc项目——java-mall,通过tomcat部署
- tomcat使用18080端口,java-mall的war放到了tomcat的webapps目录里面,可以通过http://localhost:18080/mall访问,也就是说java-mall的contextPath是mall
- 通过nginx做反向代理
nginx反向代理配置如下:
location /java-mall{
proxy_pass http://localhost:18080/mall;
}
起初我以为这样就够了,因为确实可以通过https://www.tangxuyang.cn/mall访问。不过当我准备测试接口时遇到了问题,调用登录接口后再调用别的接口一直报错,说未登录,那只能说是登录机制出来问题,更具体的是携带登录信息的媒介出了问题,当然是cookie没达到预期目标。
通过查看响应头,我发现SET-COOKIE中的path是mall,但浏览器地址是/java-mall,显然这个cookies是无效的。也就是说以后的接口请求头不会带着这个cookie。解决问题有三个方案:
- 把反向代理中的java-mall改成mall,这样就自然没问题了。但是我想添加java-前缀是因为,我还会实现一个别的语言的版本,比如node-mall抑或是python-mall。
- 修改war包的名称,从mall.war改成java-mall。
- 让nginx帮我们修改转发的cookie里的path,使用的是proxy_cookie_path
这里介绍的是第三种方案——proxy_cookie_path
proxy_cookie_path /mall /java-mall;
nginx -s reload,一切都正常了,世界是那么美好:)
发表回复