Nginx

nginx 代理後面的 Tomcat 為每個請求提供了新的 jsessionid

  • May 24, 2019

我有一個基於 ReactJS 的 Web 應用程序,由 / 上的 nginx 提供服務。此 Web 應用程序聯繫執行在 Tomcat 上的 Web 服務,該服務在同一台機器上的埠 8443 上執行。我已經在 nginx 上設置了一個 proxy_pass 以將 /APIServer 上收到的任何請求傳遞給 Tomcat 伺服器。

代理通道成功地將 /APIServer 上的請求發送到 Tomcat 伺服器。但問題是 Tomcat 為JSESSIONID來自 Web 應用程序的每個請求提供了一個新值。來自 Tomcat 的每個響應都有一個Set-Cookie帶有新的標頭,JSESSIONID而客戶端沒有Cookie為第一個請求之後的每個請求發送標頭。

我的 nginx 配置如下:

server {
   listen 80 default_server;
   listen [::]:80 default_server;

   root /var/www/html/analytics-ui;

   index index.html index.htm index.nginx-debian.html;

   server_name _;

   location / {
       try_files $uri $uri/ /index.html;
   }

   location /APIServer/ {
       proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
       proxy_set_header X-Real-IP $remote_addr;
       proxy_set_header Host $http_host;
       proxy_set_header X-Forwarded-Proto $scheme;
       proxy_set_header X-Forwarded-Host $host;
       proxy_set_header X-Forwarded-Server $host;
       proxy_set_header Access-Control-Allow-Origin *;
       proxy_redirect off;
       proxy_pass https://127.0.0.1:8443/;
   }
}

在研究如何解決此問題後,我添加了代理標頭,但到目前為止,沒有一個解決方案有效。Tomcat 仍然為JSESSIONID來自 web 應用程序的每個請求提供 new 。這會導致 Web 應用程序出現登錄和授權等功能問題。

如果我使用 Postman 或 Web 瀏覽器直接呼叫 Tomcat 伺服器上的 API,它就可以工作。

有什麼我忽略的東西,還是需要任何額外的配置才能讓它工作?

謝謝。

好吧,我是個笨蛋。

這不起作用的原因是因為我沒有在 nginx 上使用 SSL,而 Tomcat 使用 SSL。我在 nginx 中設置了 SSL,現在它按預期工作。

引用自:https://serverfault.com/questions/968712