Как сохранить URL запроса с помощью nginx proxy_pass - PullRequest
62 голосов
/ 29 апреля 2011

Я пытался использовать Тонкий сервер приложений, и у меня была одна проблема.

Когда nginx передает прокси на запрос Thin (или Unicorn), используя proxy_pass http://my_app_upstream;, приложение получает измененный URL-адрес, отправленный nginx (http://my_app_upstream).

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

Nginx ' doc говорит:

Если необходимо передать URI в необработанная форма тогда директива proxy_pass должен использоваться без URI часть.

Но я не понимаю, как именно это настроить, поскольку соответствующий пример фактически использует URI:

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

Не могли бы вы помочь мне понять, как сохранить исходный URL-адрес запроса от клиента?

Ответы [ 8 ]

105 голосов
/ 29 апреля 2011

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

location / {
    proxy_pass http://my_app_upstream;
    proxy_set_header Host $host;
    # ...
}
10 голосов
/ 12 июня 2013

Только proxy_set_header Host $ host Мисс порт для моего случая. Решено:



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

и затем в proxy.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;

3 голосов
/ 18 января 2018

nginx также предоставляет переменную $ http_host, которая передаст вам порт. это соединение хоста и порта.

Так что вам просто нужно сделать:

proxy_set_header Host $http_host;
3 голосов
/ 13 июля 2017

Для полной пересылки без обрезки absoluteURI запроса и Host в заголовке:

server {
    listen 35005;

    location / {
        rewrite            ^(.*)$   "://$http_host$uri$is_args$args";
        rewrite            ^(.*)$   "http$uri$is_args$args" break;
        proxy_set_header   Host     $host;

        proxy_pass         https://deploy.org.local:35005;
    }
}

Найдено здесь: https://opensysnotes.wordpress.com/2016/11/17/nginx-proxy_pass-with-absolute-url/

1 голос
/ 03 октября 2018

В случае, если что-то изменяет местоположение, которое вы пытаетесь обслуживать, например, try_files, это сохраняет запрос на серверную часть:

location / {
  proxy_pass http://127.0.0.1:8080$request_uri;
}
1 голос
/ 04 мая 2018

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

0 голосов
/ 16 мая 2019

Примечание для других людей, которые находят это: Суть решения, которое нужно сделать nginx не манипулирует URL, это удалить косую черту в конце Копировать: директива proxy_pass. http://my_app_upstream против http://my_app_upstream/ - Хьюго Джозефсон

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

0 голосов
/ 07 ноября 2018

для моего сервера аутентификации ... это работает.мне нравится иметь опции / auth для моей собственной гуманизированной читаемости ... или также я настроил его по порту / восходящему потоку для машины к машине.

.

в начале conf

####################################################
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;
    }
}
...