問題背景
最近在寫的一個項目,采用前后端分離的方式進行開發,登錄認證使用的是SpringSecurity框架。
問題描述
在項目部署的時候出現了一個問題,在自己電腦上運行的時候一切順暢,可是部署到服務器上就一直登錄失敗,分別測試了前端和后端的代碼,獨立運行沒有問題,打開F12查看返回的提示是發生了重定向。
問題解決
起初以為是Security的配置問題,可是試來試去都沒有什么作用,依然登錄不上。折騰半天無果后,來才考慮到nginx,只有它不一樣。security是根據url進行攔截的,是不是在反向代理的時候出了些貓膩呢?
在網上查了一圈,果然問題發生在Nginx上,修改一下Nginx的配置。
原來的配置 proxy_pass http://127.0.0.1:8080
改后的配置 proxy_pass http://127.0.0.1:8080/
加了一個斜杠,問題就解決了。
問題總結
為啥少了個斜杠就不行了呢?原來問題是Nginx代理的路徑和項目的context-path不匹配導致的。context-path = # Context path of the application. 應用的上下文路徑,也可以稱為項目路徑,是構成url地址的一部分。在每個module的application.yml文件都可以配置server.servlet.context-path這個屬性。如果進行不配置的話,它的默認值是''/'',這也就是為什么我在Nginx里加了一個斜杠問題就解決了。context-path的作用與 @RequestMapping 類似,我理解@RequestMapping用於區分不同的Controller,而context-path的主要作用是為了區分不同的模塊,這一點在使用反向代理的時候尤其重要,反向代理服務器需要通過區分context-path去辨別到底要代理哪個服務,如果找不到,它就要報錯。