web-dev-qa-db-ja.com

NGINXがすべてのリクエストヘッダーをTomcatに渡さない

NGINXを実行しているCentOSシステムとその背後にTomcatがあります。 NGINXではSSLが有効になっており、Tomcatへの接続をプッシュするためにのみ使用されます。特定のリクエストヘッダーがTomcatに到達しないことを除いて、ほとんどすべてが正常に機能しています。

私たちのJava devは、リクエストヘッダーを印刷するためのテストページを作成しました。結果は次のようになり、何を話しているかを確認できます。

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=*/* 

Nginx.confを更新して「proxy_pass_request_headers」をオンに設定しようとしましたが、何も実行されていないようです。 NGINXのサイトのconfは次のとおりです。

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";
     }
}

私の間違いがどこにあるか、正しい方向に向けられるかどうかを教えてください。これを機能させるのに問題があります。ありがとう!

3
saleetzo

アンダースコアを含むヘッダーは、nginxによって無効と見なされます。そのため、デフォルトではアンダースコアは渡されません。この動作は、underscores_in_headersディレクティブによってオーバーライドできます。例えば:

underscores_in_headers on;

詳細は このドキュメント を参照してください。

6
Richard Smith