传入请求
如何在适当的服务器块中创建 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
,您最好重写请求,应用您需要的转换,而无需重定向。
这样,从浏览器到服务器再返回的往返就减少了一次。