
У меня настроен динамический 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/;
или с некоторой (сопоставляющей) переменной для likeproxy_pass http://192.168.1.3/$device/;
или даже с полным исходным URI likeproxy_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.