当我使用nginx代理传递URL时,为什么在Tomcat8中URL重写不起作用
从nginx服务器通过代理传递请求时不工作。但当请求直接从tomcat服务器提供服务时,同样的url重写也会起作用 我让nginx服务器监听80端口,tomcat服务器监听9080端口 nginx代理传递配置当我使用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
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;
当我尝试访问urlhttp://server-name/app/xyz
,url重写正在工作。请求未转发到http://server-name/xyz
但是当使用Tomcat8配置url重写时,urlhttp://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
。这就是问题吗?是的,这就是问题所在。但我的编辑中提到的行为的原因是什么?