靈感來自:https://my.oschina.net/jastme/blog/528541
這是最近玩微服務架構遇到的一個情況,因為Spring Boot 1.5的網關不支持websocket的轉發,所以我使用了Nginx作為最外層的網關,單獨轉發websocket(rest api還是走apigateway)。同時用Nginx部署靜態web客戶端。
但是隨着功能的擴展,我發現之前配置的Nginx在轉發帶有中文encode的url時,會將url decode,然后轉發給apigateway微服務,這時候spring框架會拋出400異常,無法識別url中的字符。
location ~ ^/gate/(.*) { proxy_pass http://127.0.0.1:8081/$1; }
上面的配置時我之前的配置,Nginx會將gate/后的url decode后再拼接發送給apigateway。
后來受這個帖子(https://my.oschina.net/jastme/blog/528541)的啟發,將配置改為如下:
location ~ ^/gate { if ($request_uri ~* ^/gate/(.*)$) { proxy_pass http://127.0.0.1:8081/$1; } }
這時,Nginx將不會decode url,直接將url發送給后台的微服務,我的目的也就達到了。