Spring pageContext.request.contextPath с Tomcat за Apache в качестве обратного прокси

Я запускаю приложение Spring на удаленном сервере, где установлен сервер Tomcat, который дает доступ к моему приложению через https://mydom.com:8080/myapp.

Чтобы сделать мое приложение доступным через https://mydom.com, я установил Apache и настроил его как обратный прокси.

Это конфигурация:

<VirtualHost _default_:443>

   SSLEngine On

   SSLCertificateFile /opt/ssl/mydom_com.crt
   SSLCertificateKeyFile /opt/ssl/mydom_com.key
   SSLCertificateChainFile /opt/ssl/mydom_com.ca-bundle

   BrowserMatch ".*MSIE.*" nokeepalive ssl-unclean-shutdown downgrade-1.0 force-response-1.0
   SSLCipherSuite ALL:!ADH:!EXPORT56:RC4+RSA:+HIGH:+MEDIUM:+LOW:+SSLv2:+EXP:+eNULL

   ServerName mydom.com

   ProxyRequests Off
   ProxyPreserveHost On
   ProxyPass / http://127.0.0.1:8080/myapp/
   ProxyPassReverse / http://127.0.0.1:8080/myapp/
   ProxyPassReverseCookiePath /myapp /

</VirtualHost>

Теперь я пытаюсь использовать ${pageContext.request.contextPath} в своих jsp файлах, чтобы получить правильные ссылки и пути к ресурсам.

Когда я запускаю из IDE, он возвращает /myapp, и это хорошо.

При запуске mydom.com возвращается /myapp, что нехорошо. Мне нужно получить пустую строку или /.

Как я могу настроить, чтобы получить правильное значение для ${pageContext.request.contextPath}?

к чему вы хотите получить доступ через этот URL mydom.com?

Anish B. 18.07.2019 19:04

мое приложение от tomcat, которое запускается через https://mydom.com:8080/myapp. Но я сделал это с apache. Моя проблема в ${pageContext.request.contextPath}. На mydom.com он возвращает /myapp, который является contextPath от tomcat: https://mydom.com:8080/myapp. В mydom.com я хочу, чтобы ${pageContext.request.contextPath} было равно '/' или ''(empty string).

KunLun 19.07.2019 11:00
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
1
2
735
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Измените сопоставление с:

ProxyPass / http://127.0.0.1:8080/myapp/
ProxyPassReverse / http://127.0.0.1:8080/myapp/
ProxyPassReverseCookiePath /myapp /

к:

ProxyPass /myapp/ http://127.0.0.1:8080/myapp/
ProxyPassReverse /myapp/ http://127.0.0.1:8080/myapp/

И все ваши проблемы будут решены.

Попытка переписать контекстные пути в проксировании — причина №1 безумия администраторов Tomcat. Просто не делай этого.

Если вы хотите, чтобы ваше приложение было доступно на /, выполните одно из следующих действий:

  1. Перенаправьте / на /myapp/ и используйте мое переписанное сопоставление выше.
  2. Переименуйте свое приложение с /myapp/ на / на стороне Tomcat и исправьте отображение на карту / -> /

Любая другая конфигурация будет бесконечным циклом лейкопластырей, исправлений и лейкопластырей, которые вам придется применять.

Спасибо. Первый вариант для меня исключен. Я хочу, чтобы мой сайт был доступен через mydom.com, а не mydom.com/myapp. Поэтому я выбрал второй вариант. Я переименовал свое приложение ROOT.war и скопировал в папку webapps. Есть ли другой способ сделать это или только ROOT.war единственный способ?

KunLun 22.07.2019 11:40

У вас есть несколько вариантов, но ROOT.war — самый простой способ.

Christopher Schultz 22.07.2019 13:44

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