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

Nginx переписывает расширение .jsp и прокси на tomcat

Входящий запрос

Как я могу создать правило перезаписи Nginx в блоке сервера appriopriate, которое принимает любой URL-адрес, который не заканчивается .do и добавить .jsp extension, а чем передать запрос на прокси-сервер (Tomcat)?

Исходящий запрос

Как я могу создать правило перезаписи Nginx в блоке сервера apprioate, которое принимает любой URL-адрес, полученный с прокси-сервера (Tomcat), который заканчивается на .jsp, удалить .jsp расширение и отправить ответ клиенту?

Тест

Я попытался поиграть со следующим

server {
        listen 443 ssl;
        server_name www.test.local test.local;

        location / {
                if ($request_uri ~ ^/(.*)\.jsp$) {
                        return 302 /$1;
                }
                try_files $uri.jsp @proxy;
        }

        location @proxy {
                proxy_pass http://websites/;
                include proxy_params;
        }
}

Nginx удаляет расширение .jsp при получении запроса, но Nginx также отправляет запрос Tomcat без расширения .jsp, поэтому tomcat не знает, что искать, и возвращает 404.

Я подтвердил сказанное выше, просмотрев журналы серверов Nginx и Tomcat.

Эта проблема

Насколько я могу судить, Nginx не спрашивает Tomcat у вас есть страница $ uri.jsp но вместо этого спрашивает, если кот имеет страницу $ uri (без расширения .jsp).

Насколько я могу прочитать и понять, синтаксис try_files следующий:

try_files [Location[file, folder]] [fallback[file, folder, HTTP code]]

Но в официальной документации не говорится (насколько я могу найти), как указать Nginx (в этом случае) запрашивать у прокси-сервера различные файлы и папки для пытаться, но вместо этого запрашивает свой собственный локальный корневой каталог для $ uri.jsp и вместо этого использует @proxy в качестве запасного варианта.

Думаю, я знаю, что вам нужно:

location ^~ .jsp {
  rewrite /(.*).jsp /$1  break;
  proxy_pass         http://websites;
  proxy_redirect     off;
  proxy_set_header   Host $host;
}

Вместо того return 302, лучше переписать запрос, применив нужное преобразование без перенаправления.

Таким образом, у вас будет на один переход от браузера к серверу и обратно на один меньше.