当我使用nginx代理传递URL时,为什么在Tomcat8中URL重写不起作用

当我使用nginx代理传递URL时,为什么在Tomcat8中URL重写不起作用,tomcat,nginx,url-rewriting,Tomcat,Nginx,Url Rewriting,从nginx服务器通过代理传递请求时不工作。但当请求直接从tomcat服务器提供服务时,同样的url重写也会起作用 我让nginx服务器监听80端口,tomcat服务器监听9080端口 nginx代理传递配置 http { include mime.types; default_type application/octet-stream; sendfile on; keepalive_timeout 65; server

从nginx服务器通过代理传递请求时不工作。但当请求直接从tomcat服务器提供服务时,同样的url重写也会起作用

我让nginx服务器监听80端口,tomcat服务器监听9080端口

nginx代理传递配置

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;
        }
    }
}
location /app/ 
{
        proxy_pass http://localhost:9080/;
        proxy_set_header Host $host:$server_port;
        include /dev_resource/nginx/rewrite.conf;
} 
tomcat rewrite.config文件

RewriteRule ^app/xyz    /app/abc        [L]
当我尝试访问url时,url重写不起作用。但当通过tomcat侦听端口(服务器名称:9080/app/xyz)直接访问时,它可以工作

编辑

之前,我在nginx中配置了URL重写

nginx url重写配置

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;
        }
    }
}
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

但是当使用Tomcat8配置url重写时,url
http://server-name/app/xyz
正在转发到
http://server-name/xyz

可能重写URI,也可能不重写URI,具体取决于其参数和周围的
位置
指令

位置
代理通行证
组合将把类似
/app/xxx
的URI映射到
/xxx
上游:

location /app/ {
    proxy_pass http://localhost:9080/;
}
为了透明地向上游传递URI,请从
代理传递
指令(包括
/
)中删除URI元素:

因此,在回答您的第一个问题(编辑之前),Tomcat没有重写URI的原因是因为没有收到符合规则的URI。也就是说,没有以
/app/
开头的URI,因为
proxy\u pass
已经删除了该前缀

在回答第二个问题时(编辑后),
nginx
rewrite会在URI被
proxy\u pass更改之前看到它。因此,URI
/app/xyz
通过
rewrite
指令映射到
/app/abc
,然后通过
proxy\u pass
指令映射到
/abc
,然后被发送到上游。因此,Tomcat接收
/abc

总之,如果Tomcat应该看到URI以
/app/
开头,那么您需要修复
proxy\u pass
指令(如上所示),然后重写将在前端和后端都起同样的作用


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

我注意到
http://server-name/app/xyz
正在转发到
http://server-name:9080/xyz
。这就是问题吗?是的,这就是问题所在。但我的编辑中提到的行为的原因是什么?