我有一个运行 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;
看这个文件了解更多。