Я пытаюсь настроить 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