Назад | Перейти на главную страницу

Прокси-статический контент только для прокси-запросов

У меня есть apache, обслуживающий одно локальное приложение "/"со своими статическими файлами"/static"

И еще одно приложение с mod_proxy:

ProxyPreserveHost On
ProxyPass "/example" "http://127.0.0.1:9090/"
ProxyPassReverse "/example" "http://127.0.0.1:9090/"

И это приложение само по себе имеет статический контент "/static"но когда он приходит через прокси, то ткет файлы с первого.

¿Есть ли способ подать "/static"каждому в зависимости от того, откуда исходит восстановление?

Учитывая ваш пример, я бы ожидал, что статические файлы tomcat, расположенные в http://127.0.0.1:9090/static быть доступным под http://127.0.0.1/example/static при использовании прокси.

Возможное решение 1
Я думаю, что лучшим практическим решением было бы изменить использование относительных путей в приложении tomcat вместо абсолютного пути, поэтому статические файлы использовали последний путь;

<img src="static/my_image.jpg"></img>

или корневой родственник сервера;

<img src="/example/static/my_image.jpg"></img>

и это будет правильно обслуживать изображения, например

http://127.0.0.1/example/static/my_image.jpg

возможное решение 2
Переименуйте статические файлы apache во что-нибудь еще и явно проксируйте путь / static для tomcat;

# move the locate apache static files to somewhere else;
# http://127.0.0.1/static_apache etc
ProxyPass /static http://127.0.0.1:9090/static
ProxyPassReverse /static http://127.0.0.1:9090/static
ProxyPass "/example" "http://127.0.0.1:9090"
ProxyPassReverse "/example" "http://127.0.0.1:9090"

Также обратите внимание:

Заказ директив ProxyPass

Настроенные правила ProxyPass и ProxyPassMatch проверяются в порядке настройки. Первое подходящее правило побеждает. Поэтому обычно вам следует сортировать конфликтующие правила ProxyPass, начиная с самых длинных URL-адресов. В противном случае более поздние правила для более длинных URL-адресов будут скрыты любым более ранним правилом, которое использует ведущую подстроку URL-адреса.

Возможно хакерское решение

Определить, был ли запрос инициирован из приложения tomcat с помощью проверки заголовка referer;

RewriteEngine on
# match the app in the referer before processing the rule
RewriteCond %{HTTP_REFERER} /example
# reverse-proxy the request to the back-end
RewriteRule ^/static(/.*)?$ http://127.0.0.1:9090/static$1 [P]

(Я не тестировал это последнее решение, так как это могло показаться новинкой ...)