Nginx: Как переслать http-запрос на другой порт?


65

Что я хочу сделать, это

Когда кто-то посещает http://localhost/route/abcсервер ответ точно так же, какhttp://localhost:9000/abc

Теперь я настраиваю свой Nginx так:

location /route {
    proxy_pass  http://127.0.0.1:9000;
}

HTTP-запрос отправляется 9000правильно, а полученный путь - http://localhost:9000/route/abcнет http://localhost:9000/abc.

Любое предложение ?

Ответы:


65

Я ненавижу тонкость здесь, но попробуйте добавить / в конце 9000, как показано ниже. Теперь он больше не будет добавлять «маршрут» к перенаправленному запросу.

location /route {
    proxy_pass  http://127.0.0.1:9000/;
}

4
Это должен быть принятый ответ. Простое добавление /хорошо документировано как способ удаления префикса, указанного в расположении.
Бернард

40

Я считаю, что вы можете использовать переписать, чтобы удалить лишнюю часть URL. В вашем случае я думаю, что вы могли бы использовать:

location /route/ {
    rewrite ^/route/?(.*)$ /$1 break;    
    proxy_pass  http://127.0.0.1:9000;
    proxy_set_header Host $host;
    proxy_set_header X-Real-IP $remote_addr;
    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
}

Однако если в вашем приложении есть внутренние ссылки, они все равно могут указывать на / abc / foo, и если вы делаете это, им вместо этого нужно указывать на / route / abc / foo, чтобы необработанный запрос поступал правильно. Возможно, вам лучше оставить конфигурацию nginx такой, какой она есть, и вместо этого сконфигурировать ваше приложение, чтобы знать, что оно живет в подкаталоге, если можете.

Я знаю, что это старый вопрос, но он был главным хитом для меня, когда я пытался решить ту же проблему!


Спасибо ! в этой ссылке мы можем просмотреть список переменных: wiki.nginx.org/HttpProxyModule#Variables
Эдгард Лил

17

Попробуйте следующее

location /route/ {
        proxy_pass  http://127.0.0.1:9000;
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
}

Это решение сработало лучше для меня, поскольку оно сохраняет имя хоста.
Шафике Джамал

Чисто и просто.
Равшан Самандаров

7

vim nginx.conf

http {
    include       mime.types;
    default_type  application/octet-stream;
    sendfile        on;
    keepalive_timeout  65;

  server {
    listen 8080;

    location / {
      proxy_pass http://compute-1-36:8787;
      proxy_redirect http://compute-1-36:8787/ $scheme://$host:8080/;
    }
  }

Этот код прослушивает 8080 и перенаправляет на порт 8787 на compute-1-36. Вы можете выбрать другой путь в местоположении /

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.