NGINX 未将所有请求标头传递给 Tomcat

NGINX 未将所有请求标头传递给 Tomcat

我有一个运行 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”设置为打开,但它似乎没有做任何事情。以下是 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;

这个文件了解更多。

相关内容