当使用proxy_pass到Apache时,Nginx会在Host头之前忽略HTTP头

当Nginx发送以下请求时,Apache无法获得“app_version”HTTP头。

我通常使用apache_request_headers()来获取所有标题。 我也检查了$_SERVER的内容

 GET /stuff HTTP/1.0 app_version: 1.0 Host: example.com 

但是,当发送下面的头文件时, apache_request_headers()会返回“app_version”HTTP头文件!

 GET /stuff HTTP/1.0 Host: example.com app_version: 1.0 

问题是,我正在使用第三方REST客户端(Retrofit),它似乎以随机顺序发送标题,所以我不能简单地通过首先发送主机标头来解决这个问题。 无论如何,我不明白为什么一个带有下划线的标题或者它被放置的顺序会影响任何东西。 (头部格式与HTTP规范兼容)。 我想解决当前的问题,而不是一个解决方法。

我有以下的Nginxconfiguration:

 underscores_in_headers on; location / { proxy_set_header Host $host; proxy_set_header X-Forwarded-Proto $scheme; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_pass_request_headers on; proxy_pass http://127.0.0.1:8080; } 

什么会导致这种不一致?

尝试添加

 proxy_set_header app_version $http_app_version; underscores_in_headers on; 

到configuration。

这可能只有underscores_in_headers设置就够了。

同样的问题在这里,负载均衡器在Host头之前添加X-Forwarded-For,-Port和-Proto头文件:

 $ nc -l 443 GET / HTTP/1.1 X-Forwarded-For: xxxx X-Forwarded-Port: 443 X-Forwarded-Proto: https Host: yyyy:443 Connection: keep-alive 

Nginx永远不会填充$ proxy_add_x_forwarded_for和$ http_x_forwarded_proto,这意味着这些被丢弃。

另外,使用curl来模拟LB确实会导致nginx在正确的位置填充这个元素,HOST在x-fwd头之前:

 GET /admin/extra-commands/ HTTP/1.1 Host: xxxx X-Forwarded-For: 1.2.3.4 

我认为这是一个nginx的限制/错误