Назад | Перейти на главную страницу

Скрыть порт в перенаправлении обратного прокси Nginx

Моя установка выглядит следующим образом:

Проблема в том, что мой Nginx перенаправляет запросы на порт 8529, и это отображается в URL-адресе так http://some.domain.com:8529/foo, чего я не хочу достичь.

Мой текущий nginx sites-available связанный файл выглядит следующим образом:

server {

  listen 80;
  server_name some.domain.com;

  location / {
    proxy_pass http://localhost:8529/foo;
    proxy_redirect off;
    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_set_header        X-NginX-Proxy   true;
  }

}

куда some.domain.com внутри /etc/hosts указывает на 127.0.0.1.

Есть подсказки?

Чтобы скрыть порт во время проксирования, нужны эти две строки в теле сервера:

server_name_in_redirect off;
proxy_set_header Host $host:$server_port;

Конфигурация выглядит так:

server
{
listen 80;
server_name example.com;
server_name_in_redirect off;
proxy_set_header Host $host:$server_port;
location / {
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_pass http://localhost:8080;
}
access_log off;
}

Либо ваш вышестоящий сервер сделал редирект, и вы запрещаете nginx переписывать его с помощью proxy_redirect off; и пропуская косую черту в конце proxy_pass директива, или ваше приложение создает эти URL-адреса.

Примечание: как сказал Алексей, в этом случае важна завершающая косая черта, так как nginx удалит часть нормализованного URI, соответствующую префиксу местоположения, т.е. / прежде чем добавить его в proxy_pass URI. Таким образом, ваш внутренний сервер получит запрос на /foobar в то время как вы, скорее всего, ждете /foo/bar.