当我使用nginx代理传递URL时,为什么URL重写不能在tomcat 8中工作

当从nginx服务器传递代理请求时, Tomcat 8 URL重写不起作用。 但是,当直接从tomcat服务器提供请求时,相同的url-rewrite正在工作。

我正在监听80端口的nginx服务器和监听9080端口的tomcat服务器。

nginx proxy-passconfiguration

http { include mime.types; default_type application/octet-stream; sendfile on; keepalive_timeout 65; server { listen 80; location /app/ { proxy_pass http://localhost:9080/; proxy_set_header Host $host:$server_port; } } } 

tomcat rewrite.config文件

 RewriteRule ^app/xyz /app/abc [L] 

当我尝试访问url http:// server-name / app / xyz时 ,URL重写不起作用。 但是当直接通过tomcat侦听端口(服务器名称:9080 / app / xyz)访问它正在工作。

编辑

以前我在nginx中configuration了URL重写。

nginx url重写configuration

 location /app/ { proxy_pass http://localhost:9080/; proxy_set_header Host $host:$server_port; include /dev_resource/nginx/rewrite.conf; } 

nginx rewrite.conf

 rewrite ^/app/xyz /app/abc break; 

当我尝试访问url http://server-name/app/xyz ,url重写正在工作。 请求没有被转发到http://server-name/xyz

但是当使用tomcat 8configurationurl重写时,URL http://server-name/app/xyz被转发到http://server-name/xyz

proxy_pass指令可能会或可能会重写URI,这取决于它的参数和周围的location指令。

locationproxy_pass组合将URI /app/xxx映射到/xxx上游:

 location /app/ { proxy_pass http://localhost:9080/; } 

为了透明地向上游传递URI,从proxy_pass指令(包括/ )中删除URI元素:

 location /app/ { proxy_pass http://localhost:9080; } 

所以,在回答你的第一个问题时(编辑之前), Tomcat没有重写URI的原因是因为没有收到符合规则的URI。 也就是说,没有以/app/开头的URI,因为proxy_pass已经删除了这个前缀。

在回答你的第二个问题(在编辑之后), nginx重写将在URI被proxy_pass改变之前看到它。 所以URI /app/xyzrewrite指令映射到/app/abc ,然后在被上行发送之前被proxy_pass指令映射到/abc 。 所以, Tomcat收到/abc

总之,如果Tomcat应该看到以/app/开头的URI,那么你需要修正proxy_pass指令(如上所示),然后重写在前端和后端都是一样的。

但是,如果Tomcat应该看到/app前缀被删除的URI,那么Tomcat中的任何重写规则都不应该在匹配正则表达式中包含/app前缀。