nginx proxy_pass переписать расположение заголовка ответа

11

Цель этого экземпляра nginx - заставить GitLab и OpenWRT Luci перенаправить через обратный прокси. Он уже работает для нескольких других сайтов, у всех из которых есть базовый URL, который, кажется, противостоит этой проблеме.

  • GitLab в этом примере находится на локальном сервере с портом 9000.
  • Веб-сайт nginx находится на порте 8080.
  • OpenWRT имеет точно такую ​​же проблему, но с / cgi-bin / luci /

Соответствующая конфигурация nginx для примера местоположения:

location /gitlab/ {
    proxy_pass http://127.0.0.1:9000/;
    proxy_redirect default;
}
  • Обратите внимание, что результаты одинаковы с косой чертой и без нее.

К этому расположению применяются некоторые параметры конфигурации прокси-заголовка.

# Timeout if the real server is dead
proxy_next_upstream error timeout invalid_header http_500 http_502 http_503;

# Basic Proxy Config
proxy_set_header    Host $host:$server_port;
proxy_set_header    Origin $scheme://$host:$server_port;    
proxy_set_header    Connection $http_connection;
proxy_set_header    Cookie $http_cookie;
proxy_set_header    Upgrade $http_upgrade;
proxy_set_header    X-Forwarded-Protocol $scheme;
proxy_set_header    X-Scheme $scheme;
proxy_set_header    X-Real-IP $remote_addr;
proxy_set_header    X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header    X-Forwarded-Ssl on;
proxy_set_header    X-Frame-Options SAMEORIGIN;

# Advanced Proxy Config
send_timeout            5m;
proxy_read_timeout      300;
proxy_send_timeout      300;
proxy_connect_timeout   300;

proxy_buffers 32 4k;
proxy_buffer_size           4k;
proxy_busy_buffers_size     64k;
proxy_temp_file_write_size  64k;

proxy_http_version 1.1;
proxy_cache_bypass $cookie_session;
proxy_no_cache $cookie_session;]
  • Комментирование #proxy_set_header Хост вместо этого перенаправляет браузер на https://127.0.0.1:9000/users/sign_in

При просмотре на https://website.com:8080/gitlab/;

GET /gitlab/ HTTP/1.1
Host: website.com:8080

Ответ неверно возвращается к /users/sign_inвместо/gitlab/users/sign_in

HTTP/1.1 302 Found
Cache-Control: no-cache
Connection: keep-alive
Content-Type: text/html; charset=utf-8
Location: https://website.com:8080/users/sign_in

При просмотре вручную по адресу https: // website: 8080 / gitlab / users / sign_in загружается страница, но нет ресурсов, поскольку они падают до тех же проблем, что и выше.

GitLab Asset Fail

Читая документацию nginx , он предполагает, что поведение прокси-сервера по умолчанию должно справиться с этим сценарием, хотя, похоже, он не работает.

Журналы, кажется, не показывают много.

Какие дополнительные шаги следует предпринять, чтобы помочь диагностировать, почему это может происходить?

Джейк Эдвардс
источник

Ответы:

3

Добавьте косую черту к вашей proxy_passцели.

Обновление: OP не уточнил, что vhost принимал https. Поскольку схема пересылается на внутренний сервер с дополнительными заголовками, возникает проблема, поскольку proxy_redirect default;nginx приказывает ожидать схему http по умолчанию при перезаписи Locationзаголовков в ответах восходящего потока вместо https.

Таким образом, это должно было быть явно изменено на более общую форму (завершающий слеш по-прежнему необходим):

location /gitlab/ {
    proxy_pass http://127.0.0.1:9000/;
    proxy_redirect $scheme://$host:$server_port/ /gitlab/;
}
Ксавье Лукас
источник
Привет Ксавье, спасибо за ответ. Не повезло там. Это одна из вещей, которую я попробовал (соответствует документам proxy_pass), но без изменений :(
Джейк Эдвардс,
Я добавил информацию о proxy_set_header, который был в другом conf. Удаление строки хоста действительно меняет вещи - перенаправляет на 127.0.0.1:9000/users/sign_in
Джейк Эдвардс
Итак, проблема в scheme(https) proxy_redirect default поведении, которое ожидает http. Оставьте конфигурацию такой, какой она была до комментирования заголовка Host и измените proxy_redirectсодержимое на $scheme://$host:$server_port/ /gitlab/;. Убедитесь, что вы не используете браузерные кэшированные заголовки (используйте инструменты cli или приватную навигацию) при тестировании.
Ксавье Лукас
Хорошо, круто, так что теперь он направляется на правильный URL-адрес (по крайней мере, GitLab делает, OpenWRT по-прежнему идет в / cgi-bin / luci - хотя бы по одному). У меня нет ресурсов / изображений / и т. Д., Однако: 8080 / assets / application-5ec1aeb4604cbfbeff836f956308b0ed.js вместо: 8080 / gitlab / assets / application-5ec1aeb4604cbfbeff836f956308b0ed.js
Джейк Эдвардс,
1
@ShadowXVII Ссылки на активы генерируются вашим приложением, вы должны изменить их там. Nginx будет переписывать только перенаправления, созданные вашим приложением, а не содержимое страницы.
Ксавье Лукас
0

То, что @XavierLucas говорит, верно, что поддерживаемые должны обрабатывать ссылки. В документации gitlab есть руководство под заголовком Install GitLab под относительным URL . Я столкнулся с этой проблемой недавно, когда настраивал сервер arch linux с установленными gitlab и nginx, и это решило мою проблему, перекомпилировав все ресурсы для получения правильного относительного пути.

пистолет
источник