Я пытаюсь запустить какое-нибудь приложение 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
Как видите, я не получаю заголовок местоположения ...
Кстати, мне удалось решить проблему с помощью поддоменов, которые, похоже, работают так, как я ожидал ... В любом случае ответ был бы признателен, так как он мне может понадобиться в будущем.
Единственный способ, которым я нашел эту работу, - это использовать HttpSubModule и добавление sub_filter
директивы. Учитывая ваши примеры, это может выглядеть так:
sub_filter 'href="/' 'href="/test1/';
sub_filter "redirect('/')" "redirect('/test1/')";
Очевидно, что чем точнее будет ваше соответствие, тем больше вариантов вам придется добавить. Если вы будете менее конкретны, например, просто сопоставьте "/
или '/
тогда вам нужно меньше правил, но вы столкнетесь с опасностью подменить неправильную вещь.
Возможно, вам также потребуется добавить:
sub_filter_types *;
так что это не просто совпадение text/html
(что по умолчанию), но также файлы javascript и css. Очевидно *
- это ленивый подход, который может привести к поломке, поэтому предпочтительнее использовать определенные миметические типы.
В конечном итоге правильный способ - исправить веб-приложение. Большинство веб-фреймворков поддерживают что-то вроде базового URL-адреса / корневого URL-адреса / префикса URL-адреса (похоже, для этого нет стандартного имени), который вы можете установить, чтобы избежать именно этой проблемы.