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