Входящий запрос
Как я могу создать правило перезаписи 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
, лучше переписать запрос, применив нужное преобразование без перенаправления.
Таким образом, у вас будет на один переход от браузера к серверу и обратно на один меньше.