当从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
指令。
此location
和proxy_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/xyz
被rewrite
指令映射到/app/abc
,然后在被上行发送之前被proxy_pass
指令映射到/abc
。 所以, Tomcat收到/abc
。
总之,如果Tomcat应该看到以/app/
开头的URI,那么你需要修正proxy_pass
指令(如上所示),然后重写在前端和后端都是一样的。
但是,如果Tomcat应该看到/app
前缀被删除的URI,那么Tomcat中的任何重写规则都不应该在匹配正则表达式中包含/app
前缀。