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: // веб-сайту: 8080 / gitlab / users / sign_in завантажує сторінку, але жодні активи, оскільки вони не потрапляють до тих же проблем, що і вище.

Помилка активів GitLab

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

Журнали, схоже, мало показують.

Які додаткові кроки потрібно вжити, щоб допомогти діагностувати, чому це може статися?

Відповіді:


3

Додайте кінцеву косу рису до своєї proxy_passцілі.

Оновлення: ОП не точно визначила, що 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, який був в іншій конф. Видалення хост-лінії змінює щось - переадресовує на 127.0.0.1:9000/users/sign_in
Джейк Едвардс

Гаразд, проблема полягає в scheme(https) з proxy_redirect default поведінкою, яка очікує http. Нехай конфігурація буде такою, якою вона була, перш ніж коментувати заголовок хосту, і змініть proxy_redirectвміст на $scheme://$host:$server_port/ /gitlab/;. Переконайтеся, що під час тестування ви не потрапляєте в кешовані заголовки браузера (використовуйте інструменти cli або приватну навігацію).
Ксав'є Лукас

Гаразд, круто, тому він тепер переходить до потрібної URL-адреси (принаймні GitLab робить, OpenWRT все ще переходить до / cgi-bin / luci - хоча по одному). Не майте жодних активів / зображень / тощо, однак -: 8080 / активи / застосунок-5ec1aeb4604cbfbeff836f956308b0ed.js замість: 8080 / gitlab / активи / application-5ec1aeb4604cbfbeff836f956308b0ed.js
Джейк Едвардс,

1
@ShadowXVII Посилання "Активи" генеруються вашою програмою, ви повинні змінити її там. Nginx буде переписувати лише переспрямовування, видані вашим додатком, а не вміст сторінки.
Ксав'є Лукас

0

Те, що говорить @XavierLucas правильно, має підтримувати посилання. Документація gitlab містить посібник під заголовком Встановити GitLab під відносною URL-адресою . Нещодавно я зіткнувся з цією проблемою під час налаштування сервера арки Linux з встановленими gitlab та nginx, і це вирішило мою проблему, перекомпілювавши всі активи для правильного відносного шляху.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.