Nginx

NGINX 未將所有請求標頭傳遞給 Tomcat

  • March 17, 2019

我有一個執行 NGINX 的 CentOS 系統,後面有 Tomcat。NGINX 啟用了 SSL,僅用於推送到 Tomcat 的連接。除了某些請求標頭沒有發送到 Tomcat 之外,幾乎一切都執行良好。

我們的 Java 開發人員製作了一個測試頁面來列印請求標頭,這是結果,因此您可以看到我在說什麼:

curl -H 'auth_token: some value' -H 'Host: demo-test.domain.com' http://127.0.0.1:8080/sjl.jsp
header.user-agent=curl/7.19.7 (x86_64-redhat-linux-gnu) libcurl/7.19.7 NSS/3.27.1 zlib/1.2.3 libidn/1.18 libssh2/1.4.2
header.accept=*/*
header.auth_token=some value
header.host=demo-test.domain.com 

上面,你可以看到請求直接轉到Tomcat,注意收到了“auth_token”標頭。

下面是第二個發往 NGINX 而不是 Tomcat 的請求。注意沒有“auth_token”標頭。

curl -H 'auth_token: some value' -H 'Host: demo-test.domain.com' -k https://127.0.0.1/sjl.jsp
header.host=demo-test.domain.com
header.connection=close
header.user-agent=curl/7.19.7 (x86_64-redhat-linux-gnu) libcurl/7.19.7 NSS/3.27.1 zlib/1.2.3 libidn/1.18 libssh2/1.4.2
header.accept=*/* 

我試圖更新 nginx.conf 以將“proxy_pass_request_headers”設置為 on,但它似乎沒有做任何事情。這是 NGINX 中該站點的配置文件:

upstream demo-test.domain.com {
  ip_hash;   
  server demo-test.domain.com:8080; 
}

server {
   listen 80;
   listen [::]:80;
   server_name demo-test.domain.com www.demo-test.domain.com; 
   return 301 https://demo-test.domain.com$request_uri;
}

server {
  listen 443; 
  server_name demo-test.domain.com;

  location / {
     proxy_pass http://demo-test.domain.com;
     proxy_pass_request_headers on;
  }

  location /WebSocketServlet {
       proxy_pass http://demo-test.domain.com;
       proxy_http_version 1.1;
       proxy_set_header Upgrade $http_upgrade;
       proxy_set_header Connection "upgrade";
    }
}

如果您看到我的錯誤在哪里或者可以指出我正確的方向,請告訴我。讓這個工作有問題。謝謝!

包含下劃線的標題被 視為無效nginx,這就是預設情況下不會傳遞它們的原因。該行為可以被underscores_in_headers指令覆蓋。例如:

underscores_in_headers on;

有關更多資訊,請參閱此文件

引用自:https://unix.stackexchange.com/questions/379417