Nginx proxy_pass и абсолютные пути
Я пытаюсь запустить какое-нибудь приложение nodejs на сервере (Ubuntu 14.04), используя Nginx, и я почти закончил. Вот моя конфигурация сервера (/etc/nginx/sites-available/default
):
server {
listen 80;
server_name my_domain.com;
location /test1 {
proxy_pass http://127.0.0.1:5000/;
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection 'upgrade';
proxy_set_header Host $host;
proxy_cache_bypass $http_upgrade;
}
location /test2 {
proxy_pass http://127.0.0.1:5001/;
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection 'upgrade';
proxy_set_header Host $host;
proxy_cache_bypass $http_upgrade;
}
}
У меня запущено несколько приложений, и все они работают хорошо, я могу получить к ним доступ http://my_domain.com/test1
, http://my_domain.com/test2
, так далее...
Проблема в том, что внутри одного из этих приложений у меня есть несколько абсолютных путей:
например <a href="/">Home</a>
или (внутри экспресс)res.redirect('/');
Это перенаправления не идут в http://my_domain.com/test1
но они идут в http://my_domain.com/
Есть ли способ через конфигурации nginx сообщить приложению, что на самом деле корневое расположение http://my_domain.com/test1
?
Я действительно новичок в nginx и виртуальных хостах в целом, я пытаюсь учиться... Любая помощь будет оценена.
РЕДАКТИРОВАТЬ:
Результат curl -I http://127.0.0.1:5000
является:
HTTP/1.1 200 OK
X-Powered-By: Express
Content-Type: text/html; charset=utf-8
Content-Length: 1376
ETag: W/"560-GGm/YYltkhKxiOVNZ99jqQ"
set-cookie: connect.sid=s%3AkZYCqLKvbhHhK3W8ECBN8G91s41paws4.ekLWefrd3NdQatT3VzFNozfnFs65YBEW9k9MNTdbQT0; Path=/; HttpOnly
Date: Sat, 15 Aug 2015 13:13:20 GMT
Connection: keep-alive
Как видите, я не получаю заголовок местоположения...
Кстати, мне удалось решить проблему с помощью поддоменов, которые, кажется, работают так, как я ожидал... В любом случае, ответ был бы оценен, так как он может понадобиться в будущем.
1 ответ
Единственный способ найти эту работу - использовать HttpSubModule и добавить sub_filter
директивы. Учитывая ваши примеры, это может выглядеть так:
sub_filter 'href="/' 'href="/test1/';
sub_filter "redirect('/')" "redirect('/test1/')";
Очевидно, что чем конкретнее ваше соответствие, тем больше вариантов вам нужно добавить. Если вы идете менее конкретно, как просто сопоставить "/
или же '/
тогда вам нужно меньше правил, но вы рискуете заменить неправильную вещь.
Вы, вероятно, также должны добавить:
sub_filter_types *;
так что это не просто совпадает text/html
(который используется по умолчанию), но также файлы javascript и css. очевидно *
Это ленивый подход, который может сломать вещи, и использование определенных типов mimetypes должно быть предпочтительным.
В конечном итоге правильный путь - это исправить веб-приложение. Большинство веб-фреймворков поддерживают что-то вроде базового префикса url / root url / url (кажется, для этого нет стандартного имени), который вы можете установить, чтобы избежать именно этой проблемы.