Обратный прокси-сервер - Удалить подкаталог

27

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

https://www.mysitename.com/site1

Два других сервера в этом примере - это site1 и site2. Я установил SSL-сертификат на прокси-сервере и хочу использовать обратный прокси-сервер (SSL не требуется, так как все 3 находятся во внутренней сети). В целях тестирования у меня nginx прослушивает 443 для SSL / обратный прокси, прослушивает порт 8081, который является приложением rails для 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 сайта, чтобы использовать site1? Или прокси-сервер NGINX может это выяснить?

Спасибо.

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

Ответы:

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 - но это не вопрос сервера, поэтому я выясню это в другом месте.
Chromag
обратите внимание, что вам также нужно добавить косую черту в URL proxy_pass!
Дэниэл Хилл