@navion

Проксирование сайта с абсолютными путями в location nginx?

Имеется сервер с nginx, смотрящий в интернет по адресу proxy.domain.tld

И сайт в локальной сети, живущий по адресу web.local.tld


Необходимо выставить сайт из локальной сети по адресу proxy.domain.tld/web, но проблема в том, что в разметке внутреннего сайта используются абсолютные пути вида:

<a href="/some/page/">...</a>


В итоге все ссылки указывают на корень прокси, который про них ничего не знает.


Можно ли это обойти на nginx и как?
  • Вопрос задан
  • 4019 просмотров
Решения вопроса 1
@BasilioCat
Не совсем универсально, но без модификации кода проксируемого приложения это делается при помощи хаков модуля sub. К сожалению, можно задать только одну замену (к примеру src="/ на src="/web/), но это обходится вложенностью запросов (тоже своего рода хак)
Ответ написан
Комментировать
Пригласить эксперта
Ответы на вопрос 2
@temaHT
Можно подумать над следующим вариантом. При отдаче конетнта с web.local.tld nginx выставляет отдельную куку, котроая является флажком того, что пользователь находится в /web.

При последующем запросе делать анализ присутствия данной куки. И если она присутствует, то все запросы или редиректить или «реврайтить» на web.local.tld.

Решение имеет кое какие недостатки (в частности если юзер начал смотреть /web/, то на основной сайт он уже не попадет, т.к. кука уже выставлена). Но теоретически их можно обойти.
Ответ написан
@inkvizitor68sl
Linux-сисадмин с 8 летним стажем.
Можно.
Если пойти простым (но стоит понимать, что это не для high-load), то:
location / {
error_page 404 = @fallback;
}
location @fallback {
rewrite ^/(.*) proxy.domain.tld/web/$1 permanent;
proxy_pass backend;
}
location /web {
proxy_pass блаблабла и всё остальное;
}

А на принимающем веб-сервере сделать:
location /web {
rewrite ^/web(.*) web.local.tld/$1 last;
}

Должно заработать. В любом случае копайте в сторону такого алгоритма:
1) проверяем, есть ли такая страница.
2) если нет — дописываем /web/ и проксируем на web.local
3) на принимающей стороне делаем last-rewrite, убирая web и отдаём страничку.

Можно выкинуть третий пункт, перенеся ваш сайт в /web на web.local, если это не повредит пользователям.
Вообще с такими вопросами лучше на форум nginx или к ним в рассылку идти.
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы