NGINXがすべてのリクエストヘッダをTomcatに渡すわけではありません

NGINXがすべてのリクエストヘッダをTomcatに渡すわけではありません

Tomcatの背後にあるNGINXを実行するCentOSシステムがあります。 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」ヘッダーが受信されることに注意してください。

以下は、TomcatではなくNGINXに送信された2番目の要求です。 「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=*/* 

"proxy_pass_request_headers"をオンにするようにnginx.confを更新しようとしましたが、何もしないようです。以下は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";
     }
}

どこに間違っているかを知っているか、正しい方向を教えてください。正常に動作するのに問題があります。ありがとうございます!

ベストアンサー1

下線付きのヘッダーは無効と見なされるため、デフォルトnginxでは渡されません。この動作はunderscores_in_headersディレクティブでオーバーライドできます。たとえば、

underscores_in_headers on;

バラよりこのファイルもっと学ぶ。

おすすめ記事