Назад | Перейти на главную страницу

Измените заголовок ответа с помощью nginx

Я пытаюсь настроить nginx как обратный прокси-сервер для веб-приложения на внутреннем сервере Domino. У нас работает 99,9%, но эти последние 0,1% меня действительно беспокоят.

Я объясню. В некоторых случаях приложение возвращает частичное обновление со специальным заголовком ответа, называемым X-XspLocation. Если он существует, он содержит URL-адрес, на который будет перенаправлен клиент. Это заголовок, генерируемый и используемый средой XPages, сам мой код не устанавливает и не читает его. Тогда его значение:

http://localhost:81/database.nsf/page.xsp/ThankYou

и я хочу, чтобы это было так: / Спасибо

Я пробовал миллионами способов, но, кажется, невозможно изменить его ценность. Как только я использую proxy_hide_header X-XspLocation; нельзя добавлять новые заголовки с помощью add_header! Если я оставлю укрытие, я получаю двойные значения в заголовке, поэтому я знаю, что мое значение замены верное. Вот моя последняя неудачная попытка:

map $sent_http_x_xsplocation $xsplocation_new {
    "~http://localhost:81/database.nsf/page.xsp/(.*)" "/$1";
}
server {
    ...
    location / {
      proxy_pass   http://localhost:81/database.nsf/page.xsp/;
      # redirect X-XspLocation
      proxy_hide_header X-XspLocation;
      add_header X-XspLocation $xsplocation_new;
      #add_header X-XspLocation2 $xsplocation_new;
    }
}

Я даже пытался с помощью njs изменить заголовок, вероятно, это не удалось, потому что я не знаю, как использовать js_set или js_content для вызова функции, которая ничего не возвращает.

Почему так чертовски сложно изменить заголовок ответа ??

Настоящий вопрос, конечно, заключается в следующем: как я могу заставить это работать ?? Спасибо за твою помощь!!

Больше информации

Чтобы доказать, что карта работает, я протестировал следующее:

    location / {
      proxy_pass   http://localhost:81/database.nsf/page.xsp/;
      # redirect X-XspLocation
      # proxy_hide_header X-XspLocation;
      # add_header X-XspLocation $xsplocation_new;
      add_header X-XspLocation2 $xsplocation_new;
    }

В результате исходный заголовок плюс новый заголовок X-XspLocation2 присутствуют, а второй - именно то, что мне нужно в X-XspLocation.

Кстати, версия nginx: nginx / 1.18.0 на Ubuntu 16.04.6 LTS (система моего клиента, а не моя ...)

Полный цензурированный файл конфигурации

map $sent_http_x_xsplocation $xsplocation_new {
    "~http://localhost:81/database.nsf/page.xsp/(.*)" "/$1";
}

server {
    listen       4443 ssl;
    server_name  www.myclient.nl;

    ssl_certificate       /etc/nginx/ssl/www.myclient.nl.pem;
    ssl_certificate_key   /etc/nginx/ssl/www.myclient.nl.pem;

    # do not allow google to index this website
    # TODO: remove when going to production
    add_header  X-Robots-Tag "noindex, nofollow, nosnippet, noarchive";

    # replace redirects in response header fields Location and Refresh
    proxy_redirect http://localhost:81/database.nsf/page.xsp/ https://www.myclient.nl:4443/;
    proxy_redirect http://localhost:81/ https://www.myclient.nl:4443/;

    # tell domino not to encode the response so we can use sub_filter
    proxy_set_header Accept-Encoding "";

    # substitute response content
    sub_filter 'localhost:81'       'www.myclient.nl:4443';
    sub_filter 'www.myclient.nl' 'www.myclient.nl:4443'; #TODO: remove when going production
    sub_filter '/database.nsf/page.xsp/'  '/';
    sub_filter '/database.nsf/'           '/other/';
    sub_filter_once off;

    # Domino
    location = /favicon.ico {
      access_log off; log_not_found off;
      proxy_pass http://localhost:81/database.nsf/Images/favicon.ico/%24file/favicon.ico;
    }

    # root / homepage
    location = / { proxy_pass   http://localhost:81/database.nsf/page.xsp/HomePage; }

    #login
    location /names.nsf { proxy_pass http://localhost:81/names.nsf; }

    # XPages
    location /xsp/ { proxy_pass  http://localhost:81/xsp/; }
    location /domjava/ { proxy_pass  http://localhost:81/domjava/; }

    # training
    location ~* ^/.*-training/(.*) {
      proxy_pass http://localhost:81/database.nsf/page.xsp/training/$1;
    }
    location ~* ^/(.*)-training$ {
      proxy_pass http://localhost:81/database.nsf/page.xsp/$1;
    }

    # IMAGES
    # image resources - any case insensitive match with 'images'
    location ~* '/images/(.*)$' {
      proxy_pass   'http://localhost:81/database.nsf/Images/$1';
    }
    # images referenced from css in file.xsp have this url, redirect to backend correctly
    location ~* '/file.xsp/images/(.*)$' {
      proxy_pass   'http://localhost:81/database.nsf/Images/$1';
    }

    # file resources
    location /file.xsp/ { proxy_pass  http://localhost:81/database.nsf/file.xsp/; }

    # other resources
    location /other/ { proxy_pass   http://localhost:81/database.nsf/; }

    # all other urls
    location / {
      proxy_pass   http://localhost:81/database.nsf/page.xsp/;
      # redirect X-XspLocation
      #add_header X-XspLocation $xsplocation_new always;
      proxy_hide_header X-XspLocation;
      add_header X-XspLocation $xsplocation_new;
    }
}

"Почему так чертовски сложно изменить заголовок ответа ??"

Некоторым людям тоже нужно зарабатывать на жизнь!

Ах, это был не настоящий вопрос. Черт. Попробуй это

map $upstream_http_x_xsplocation $m_replaceme {
    ""  "";
    "~^.*/page.xsp/(.*)$" "/$1";
    "~.*" "";
}

location / {
      proxy_pass   http://localhost:81/database.nsf/page.xsp/;
      proxy_hide_header X-XspLocation;
      add_header X-XspLocation  $m_replaceme;
}

Протестировано с nginx / 1.14.2