Nginx Невозможно передать пользовательский заголовок в прокси - PullRequest
0 голосов
/ 11 июля 2020

Я запускаю Nginx / 1.17.5 и wi sh для передачи настраиваемого заголовка с подчеркиванием прокси.

Если подчеркивание удалено из заголовка (x-test вместо x_test ), затем заголовок проходит.

Вот конфиги

server {
    listen 80 default_server;
    access_log /dev/stdout main;

    location /ping {
        return 200 'pong';
    }

    proxy_pass_request_headers on;
    underscores_in_headers on;

    location / {
        proxy_pass https://example.com:443;
        add_header x_test $http_x_test always;
    }
}

Работает

curl -X POST 'https://example.com/upstream-app/ \
-H 'Accept: application/json' \
-H 'Content-Type: application/json' \
-H 'x-test: 7359af9c-a191-41b7-aeab-a3389e1c5e1e' \
--data '{
"body": "VALID",
"from": "99999",
}'

Не работает

curl -X POST 'https://example.com/upstream-app/ \
-H 'Accept: application/json' \
-H 'Content-Type: application/json' \
-H 'x_test: 7359af9c-a191-41b7-aeab-a3389e1c5e1e' \
--data '{
"body": "VALID",
"from": "99999",
}'

Любые идеи / указатели на это были бы очень признательны.

Ответы [ 2 ]

0 голосов
/ 15 июля 2020

# Fix

Обновил proxy.conf до

server {
    listen 80 default_server;
    access_log /dev/stdout main;

    location /ping {
        return 200 'pong';
    }

    underscores_in_headers on;

    location / {
        proxy_pass https://example.com:443;
        proxy_pass_request_headers on;
    }
}

Затем в контейнере Docker установите TcpDump и запустите следующее, чтобы проверить все заголовки GET и POST, а также включить заголовки с подчеркиванием в соответствии с регулярным выражением. NB, в приведенной ниже команде предполагается, что Docker работает на порту 80, для которого задан правильный номер порта.

stdbuf -oL -eL /usr/sbin/tcpdump -A -s 10240 "tcp port 80 and (((ip[2:2] - ((ip[0]&0xf)<<2)) - ((tcp[12]&0xf0)>>2)) != 0)" | egrep -a --line-buffered ".+(GET |HTTP\/|POST )|^[_A-Za-z0-9-]+: " | perl -nle 'BEGIN{$|=1} { s/.*?(GET |HTTP\/[0-9.]* |POST )/\n$1/g; print }'
0 голосов
/ 11 июля 2020

Чтобы это сработало, вам нужно будет использовать балансировку нагрузки tp c с помощью ngx_stream_core_module

Поскольку вы собираетесь использовать завершение SSL для внутреннего сервера, а не в inte rnet -facing балансировщик нагрузки, вам придется использовать SSL-passthrough, который может быть выполнен модулем потока.

Попробуйте следующее:

user  nginx;
worker_processes  1;
error_log  /var/log/nginx/error.log warn;
pid        /var/run/nginx.pid;
events {
    worker_connections  1024;
}
http {
  upstream example-http {
    server example.com:80;
  }
  server {
    listen 80 default_server;
    access_log /dev/stdout main;

    location / {
      proxy_set_header X-Real-IP $remote_addr;
      proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
      proxy_set_header X-Forwarded-Proto $scheme;
      proxy_set_header Host $http_host;
      proxy_set_header X-Forwarded-Host $server_name;
      proxy_set_header Connection "";
      add_header    x_test $http_x_test always;
      proxy_redirect     off;
      proxy_connect_timeout  60;
      proxy_http_version 1.1;
      proxy_pass_request_headers on;
      underscores_in_headers on;
      proxy_pass http://example-http$request_uri;
    }
    location /ping {
        return 200 'pong';
    }
  }
}
stream {
  upstream example-https {
    server example.com:443;
  }

  server {
    proxy_protocol on;
    tcp_nodelay on;
    listen 443;
    proxy_pass example-https;
  }
}
...