Як зберегти URL-адресу запиту за допомогою nginx proxy_pass


80

Я намагався використовувати сервер тонких додатків і мав одну проблему.

Коли nginx проксі- сервер, запит до Thin (або Unicorn) за proxy_pass http://my_app_upstream;допомогою програми отримує змінену URL-адресу, надіслану nginx ( http://my_app_upstream).

Я хочу передати оригінальну URL-адресу та оригінальний запит від клієнта без будь-яких змін, оскільки додаток значною мірою покладається на нього.

У Nginx » документ говорить:

Якщо необхідно передати URI у необробленій формі, тоді директива proxy_pass повинна використовуватися без частини URI.

Але я не розумію, як саме це налаштувати, оскільки відповідний зразок насправді використовує URI:

location  /some/path/ {
  proxy_pass   http://127.0.0.1;
}

Тож не могли б ви допомогти мені з’ясувати, як зберегти оригінальну URL-адресу запиту від клієнта?

Відповіді:


135

Я думаю, що proxy_set_headerдиректива може допомогти:

location / {
    proxy_pass http://my_app_upstream;
    proxy_set_header Host $host;
    # ...
}

92
Примітка для інших людей, які знаходять це: Основою рішення, щоб зробити nginx не маніпулювати URL-адресою, є видалення косої риски в кінці proxy_passдирективи. http://my_app_upstreamпротиhttp://my_app_upstream/
Hugo Джозефсон

2
Для мене те, що відбувалося, це те, що коли JSP робив переспрямування, відображалося ім'я хоста my_app_upstream. Використовуючи proxy_set_header Host $hostмодифікований та зроблений Tomcat / JSP, щоб думати, що це фактичний домен, який запитується клієнтом. Дякую за допомогу
ankitjaininfo

1
@HugoJosefson wow спасибі богу, я помічаю ваш пост. Це має бути чітко вказано у відповіді
плюс

3
У моєму випадку рішення @ HugoJosefson не працює. Я вказував на localhost: port ; Мені довелося встановити заголовок.

2
Це вдосконалення, але схема (http або https) не збереглася. Тепер мій https://example.com/pageуріс стаєhttp://example.com/page
Джон Сміт Необов’язково

11

Просто proxy_set_header Хост $ host miss port для мого випадку. Вирішено:



    location / {
     proxy_pass http://BACKENDIP/;
     include /etc/nginx/proxy.conf;
    }

а потім у проксі.conf



    proxy_redirect off;
    proxy_set_header Host $host:$server_port;
    proxy_set_header X-Real-IP $remote_addr;
    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;


1
Дякую, саме цього фрагмента мені не вистачало ($ server_port), щоб перевірка OAuth працювала на кінцевій точці позаду проксі.
Реньє

Я використовую стійку із sinatra і отримую заборону на URL-адреси POST. Додавання порту до заголовка проксі-сервера Host це виправило для мене.
пдю

це більше не працює в останніх версіях Nginx я думаю stackoverflow.com/questions/31482796 / ...
Iwein

4

nginx також надає змінну $ http_host, яка передаватиме вам порт. це об'єднання хоста та порту.

Тож вам просто потрібно зробити:

proxy_set_header Host $http_host;

4

Примітка для інших людей, які знаходять це: Основою рішення, щоб змусити nginx не маніпулювати URL-адресою, є видалення косої риски в кінці директиви Copy: proxy_pass. http: // my_app_upstream проти http: // my_app_upstream / - Hugo Josefson

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



3

У випадку, якщо щось змінює місце розташування, яке ви намагаєтесь обслуговувати, наприклад try_files, це зберігає запит на бек-енд:

location / {
  proxy_pass http://127.0.0.1:8080$request_uri;
}

2

У моєму сценарії я зробив це за допомогою коду нижче в конфігурації nginx vhost

server {
server_name dashboards.etilize.com;

location / {
    proxy_pass http://demo.etilize.com/dashboards/;
    proxy_set_header Host $http_host;
}}

$ http_host встановить URL-адресу в заголовку так само, як запитується


-1

для мого аутентифікаційного сервера ... це працює. Мені подобається мати параметри / auth для моєї власної гуманізованої читабельності ... або також я налаштовую його за допомогою порту / вищого рівня для машини на машину.

.

на початку конф

####################################################
upstream auth {
    server 127.0.0.1:9011 weight=1 fail_timeout=300s;
    keepalive 16;
  }

Всередині мого блоку сервера 443

          if (-d $request_filename) {
          rewrite [^/]$ $scheme://$http_host$uri/ permanent;
      }

  location /auth {
          proxy_pass http://$http_host:9011;
          proxy_set_header Origin           http://$host;
          proxy_set_header Host             $http_host:9011;
          proxy_set_header X-Forwarded-For  $proxy_add_x_forwarded_for;
          proxy_set_header Upgrade          $http_upgrade;
          proxy_set_header Connection       $http_connection;
          proxy_http_version 1.1;
      }

Внизу конф

#####################################################################
#                                                                   #
#     Proxies for all the Other servers on other ports upstream     #
#                                                                   #
#####################################################################


#######################
#        Fusion       #
#######################

server {
    listen 9001 ssl;

#############  Lock it down  ################

# SSL certificate locations
    ssl_certificate /etc/letsencrypt/live/allineed.app/fullchain.pem;
    ssl_certificate_key /etc/letsencrypt/live/allineed.app/privkey.pem;

# Exclusions

    include snippets/exclusions.conf;

# Security

    include snippets/security.conf;
    include snippets/ssl.conf;

# Fastcgi cache rules

    include snippets/fastcgi-cache.conf;
    include snippets/limits.conf;
    include snippets/nginx-cloudflare.conf;

###########  Location upstream ##############

    location  ~ / {
        proxy_pass http://auth;
        proxy_set_header Origin           http://$host;
        proxy_set_header Host             $host:$server_port;
        proxy_set_header X-Forwarded-For  $proxy_add_x_forwarded_for;
        proxy_set_header Upgrade          $http_upgrade;
        proxy_set_header Connection       $http_connection;
        proxy_http_version 1.1;
    }
        if (-d $request_filename) {
        rewrite [^/]$ $scheme://$http_host$uri/ permanent;
    }
}
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.