Apache+mod_jk и специальный обработчик 404

У меня есть относительно простой Apache httpd + Tomcat с настройкой mod_jk, который хорошо работает, но мне нужно, чтобы Tomcat справился с некоторыми условиями 404. По сути, служба httpd будет обрабатывать изображения и файлы PDF, а также время от времени пытаться взломать IIS. Однако файлы PDF на самом деле создаются Tomcat и позже удаляются из файловой системы, и некоторые люди размещают ссылки на эти изменчивые документы PDF в Интернете. Это приводит к 404 сообщениям, когда я действительно хочу, чтобы пользователь увидел форму, из которой был создан PDF.

Конечно, я могу заставить Tomcat справиться со всеми 404:

ErrorDocument 404 /404.jsp

Но их слишком много, и Tomcat просто видит 404.jsp, он не знает, каким был исходный URL. Что мне нужно это:

  1. httpd продолжает обслуживать все изображения, PDF-файлы и т. д.
  2. если файл PDF отсутствует, отправьте этот запрос через mod_jk. Для всех других типов он продолжает отвечать своим собственным 404.
  3. Tomcat выясняет, откуда на самом деле появился PDF, и перенаправляет пользователя на эту страницу.

Это выполнимо без слишком большой операции.conf?

2 ответа

Вы могли бы сделать умные 404 jsps, которые используют просмотр ссылающегося URL и перенаправить запрос, основанный на некоторой логике в jsp, или перенаправить через javascript. Если у реферера есть.pdf в URL-адресе, проанализируйте URL-адрес и перенаправьте пользователя в нужную форму, предполагая, что вы можете найти нужную форму на основе запрошенного PDF-файла.

Если PDF-файл действительно генерируется на веб-сервере и некоторое время находится там для обслуживания из apache, попробуйте использовать mod_rewrite для всех несуществующих файлов, оканчивающихся на ".pdf", и переписать запрос в jsp. Предполагая, что вы не создадите файл с тем же именем снова (в этом случае не используйте постоянное перенаправление) (также при условии, что у вас нет URL-адресов формы /foo.pdf?specialjuice=1 поскольку RewriteRule ниже потеряет специальный сок):

RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^(.*\.pdf)$ /generateform.jsp?oldurl=$1 [R=301,L]

Все, что не существует, должно получить обычный обработчик 404.

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