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 такою, якою вона є, і замість цього налаштувати додаток так, щоб він знав, що він живе у підкаталозі, якщо зможете.

Я знаю, що це давнє запитання, але це був найкращий хіт Google для мене, коли я намагався вирішити ту саму проблему!


Дякую ! за цим посиланням ми можемо переглянути список змінних: wiki.nginx.org/HttpProxyModule#Variables
Edgard Leal

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 на обчисленні-1-36. Ви можете вибрати інший шлях у розташуванні /

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