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  

Поскольку Вы видите, что я не получаю Заголовок Местоположения...
Между прочим, мне удалось решить проблему с помощью субдоменов, которые, кажется, работают, как я ожидал... Так или иначе ответ ценился бы, так как мне, возможно, понадобился бы он в будущем.

6
задан 15 August 2015 в 16:33
1 ответ

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

2
ответ дан 3 December 2019 в 00:40

Теги

Похожие вопросы