Зворотний проксі - видаліть підкаталог


27

Найближчим часом у мене буде 3 сервери nginx. Один - це зворотний проксі для SSL для двох інших. Так, наприклад, я переходжу до:

https://www.mysitename.com/site1

Два інших сервери в цьому прикладі - це site1 та site2. Я встановив сертифікат SSL на проксі і хочу використовувати зворотний проксі (SSL не потрібно, оскільки всі 3 знаходяться у внутрішній мережі). Для цілей тестування я маю nginx слухати 443 для SSL / reverse-proxy, слухайте далі порт 8081, що є додатком для рейків для site1, а 8082 - для site2.

Я маю це ...

server {
    listen                  443;
    server_name             mysitename.com;

    ssl                     on;
    ssl_certificate         ssl/mysitename.com.crt;
    ssl_certificate_key     ssl/mysitename.com.key;
    keepalive_timeout       60;

    location /site1 {
        proxy_pass http://localhost:8081;
        proxy_set_header    Host            $host;
        proxy_set_header    X-Real-IP       $remote_addr;
        proxy_set_header    X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_redirect http:// https://;
    }

    location /site2 {
        proxy_pass http://localhost:8082;
        proxy_set_header    Host            $host;
        proxy_set_header    X-Real-IP       $remote_addr;
        proxy_set_header    X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_redirect http:// https://;
    }
}

Отже, коли я відвідую www.mysitename.com/site1, я хочу, щоб він в основному повертав те, що зазвичай походить від localhost: 8081 (або пізніше вниз за внутрішньою IP-адресою іншого сервера).

Чи є спосіб, щоб він зняв "site1" з виклику localhost? Здається, це використання localhost: 8081 / site1. Сайти site1 та site2 мають характер "/ login / index" або "/ what / list" тощо, без "site1".

Також у контролерах сайту є переспрямування (використовуючи redirect_to), які переходять від таких речей, як / login / index до / what / list.

Мені доведеться переробляти URL-адреси веб-сайту, щоб використовувати сайт1? Або проксі-сервер NGINX може це зрозуміти?

Спасибі.


Для Socket.io спробуйте це просто додати переписати /(.*) /socket.io/ break; serverfault.com/questions/444532/…
користувач956584

Відповіді:


53

Цитуючи http://nginx.org/r/proxy_pass :

Якщо proxy_pass вказано з URI, при передачі запиту на сервер частина нормалізованого URI запиту, що відповідає розташуванню, замінюється URI, зазначеним у директиві:

location /name/ {
    proxy_pass http://127.0.0.1/remote/;
}

Тобто, ви повинні використовувати proxy_passтак:

location /site1/ {
    proxy_pass http://localhost:8081/;
    ...
}

Зверніть увагу на трейлінг /в proxy_passдирективі - він замінить частину вихідного URI, відповідного розташуванню, тобто /site1/.


2
Все, що потрібно, - це косою косою рисою, щоб вирішити проблему !? Дякую за це. Тепер, щоб зрозуміти, як я буду обробляти redirect_to - але це не питання сервера, тож я розберу це в іншому місці.
Хрома

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