NGINX — перенаправление запроса на другой IP, сохраняя URL

NGINX — перенаправление запроса на другой IP, сохраняя URL

У меня настроен динамический DNS, и я хочу иметь возможность доступа к разным компьютерам из-за пределов моего дома. В настоящее время у меня есть Raspberry Pi с запущенным Nginx на 192.168.1.2, а мой маршрутизатор находится на 192.168.1.1. У меня также есть переадресация порта 80 с маршрутизатора на Raspberry Pi, поэтому простое нажатие на динамический URL DNS показывает мне страницу phpinfo() на моей целевой странице Pi.

Далее я хочу иметь возможность mydns.com/device1сохранить этот URL-адрес и при этом перенаправить его на другое устройство.

Другими словами, я увижу http://mydns.com/device1, но у меня будет http://192.168.1.3внутренний доступ. Кроме того, если я наберу , mydns.com/device1/loginон перенаправит внутренне на http://192.168.1.3/login.

Я пытаюсь использовать sub_filterвот так:

sub_filter_once off;
sub_filter_types text/html;
sub_filter ""http://192.168.1.3" "http://192.168.1.2"
proxy_pass http://192.168.1.3/;
proxy_set_header Host $host;

Это работает в некоторой степени, но не полностью. Пути не перенаправляются, например, файлы в подпапках. Например:

Я хочу это: http://mydns.com/device1/style/basic.css

Но вот что: http://mydns.com/style/basic.css

Это приводит к ошибке 404, как можно увидеть в представлении консоли в Chrome. Я получаю эту ошибку:

Failed to load resource: the server responded with a status of 404 (Not Found)

Это на пути: http://mydns.com/style/basic.cssно мне нужно http://mydns.com/device1/style/basic.css.

Я могу получить доступ к CSS-файлу в адресной строке, введя http://mydns.com/device1/style/basic.css. поэтому я знаю, что он доступен, но я не могу заставить NGINX пересылать/перезаписывать эти папки.

Кто-нибудь может помочь? Спасибо.

решение1

Причин может быть несколько:

  • либо что-то перезаписывает ваш URI до того, как он попадет в местоположение с proxy_pass;
  • или он предоставляется как сопоставленный суб-URI в некоторых местах, обработанных ранее;
  • или (в вашей версии nginx) косая черта /после IP в директиве proxy_pass приводит к тому, что nginx воспринимает косую черту как URI прокси-сервера и перезаписывает его перед отправкой.

Невозможно увидеть, что именно происходит на вашей стороне, не увидев всю вашу конфигурацию. Или вы можете попробовать включить отладочный журнал (чтобы увидеть, что вызывает это).

В любом случае, учитывая вышеизложенные причины, у вас есть 3 способа решения этой проблемы:

  • либо вам придется избегать перезаписи, либо вам придется добавить дополнительный параметр rewrite ... breakперед proxy_pass для расширения URI;
  • или вы можете попытаться определить его как proxy_pass http://192.168.1.3/device1/;или с некоторой (сопоставляющей) переменной для like proxy_pass http://192.168.1.3/$device/;или даже с полным исходным URI like proxy_pass http://192.168.1.3$request_uri;(обратите внимание, что здесь нет /).
  • или вы можете попробовать удалить завершающий слеш, так что proxy_pass http://192.168.1.3;(без слеша) вместо proxy_pass http://192.168.1.3**/**;(со слешем).
    В этом случае «URI запроса передается на сервер в той же форме, в которой он был отправлен клиентом при обработке исходного запроса» (если не происходит никакой перезаписи), или «полный нормализованный URI запроса передается при обработке измененного URI» (если происходит какая-то переписывание или у вас есть некоторые промежуточные расположения с псевдонимами и try_files ... @proxyпереданы).

Взгляни наproxy_passдокументация по всем возможным вариантам использования proxy_pass.

Связанный контент