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 (кажется, для этого нет стандартного имени), который вы можете установить, чтобы избежать именно этой проблемы.

Другие вопросы по тегам