Nginx 重写 .jsp 扩展并代理到 tomcat

Nginx 重写 .jsp 扩展并代理到 tomcat

传入请求

如何在适当的服务器块中创建 Nginx 重写规则,该规则接受任何 URL,不以任何 URL 结尾.do并添加.jsp扩展名,然后将请求交给代理(Tomcat)服务器?

发出请求

如何在适当的服务器块中创建 Nginx 重写规则,该规则接受从代理(Tomcat)服务器接收的任何以 结尾的 URL .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 页面吗而是询问 tomcat有一个 $uri 页面(没有 .jsp 扩展名)。

据我所知,try_files 语法是

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

但官方文档没有说(据我所知)如何指示 Nginx(在这种情况下)向代理请求不同的文件和文件夹尝试,而是查询其自己的本地根位置以获取 $uri.jsp,然后使用 @proxy 作为后备。

答案1

我想我知道你需要什么:

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

相反return 302,您最好重写请求,应用您需要的转换,而无需重定向。

这样,从浏览器到服务器再返回的往返就减少了一次。

相关内容