Входящий запрос
Как я могу создать правило перезаписи Nginx в блоке сервера appriopriate, которое принимает любой URL, который не заканчивается на .do
и добавить расширение .jsp
, а затем передать запрос на прокси-сервер (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 extension, поэтому tomcat не знает, что искать, и возвращает 404.
Я подтвердил вышесказанное, посмотрев на сервер Nginx и Tomcat. logs.
The problem
As far as i can tell, Nginx is not asking Tomcat do you have a $uri.jsp page but is instead asking if tomcat has a $uri page (without .jsp extension).
As far as i can read and understand, the try_files syntax is
try_files [Location[file, folder]] [fallback[file, folder, HTTP code]]
But the official documentation does not say (as far as i can find) how to instruct Nginx to (in this case) ask the proxy for the different files and folders to try, but is instead quering its own local root location for $uri.jsp and than using @proxy as fallback.
Думаю, я знаю, что вам нужно:
location ^~ .jsp {
rewrite /(.*).jsp /$1 break;
proxy_pass http://websites;
proxy_redirect off;
proxy_set_header Host $host;
}
Вместо return 302
лучше переписать запрос, применив нужное преобразование без перенаправления.
Таким образом вы сможете на один переход от браузера к серверу и обратно на один меньше.