替换 2 行...
_ctx.setHandler(rewriter);
_handlerCollection.setHandlers(new Handler[] {_ctx});
with
rewriter.setHandler(_ctx);
_handlerCollection.setHandlers(new Handler[] {rewriter});
这将使重写规则生效before正常的上下文处理。
将上下文处理视为一棵树。在你的示例代码中你有......
server
+-- HandlerCollection
[0]-- WebAppContext
+-- Your servlets and filters in web.xml
+-- DefaultServlet
+-- RewriteHandler
这意味着如果WebAppContext
无法处理请求,那么RewriteHandler
执行以查看是否可以处理该请求。这永远不会发生,因为WebAppContext
已设置为使用DefaultServlet
如果没有其他匹配。
建议的简单更改将树更改为如下所示......
server
+-- HandlerCollection
[0]-- RewriteHandler
+-- WebAppContext
+-- Your servlets and filters in web.xml
+-- DefaultServlet
这将允许RewriteHandler
在之前做它的事情WebAppContext
甚至被问到。
注意:您还可以让您的代码使用HandlerCollection
对于这种情况也更合适一些。
// _ctx.setHandler(rewriter);
// rewriter.setHandler(_ctx);
_handlerCollection.setHandlers(new Handler[] { rewriter, _ctx });
这将产生以下树
server
+-- HandlerCollection
[0]-- RewriteHandler
[1]-- WebAppContext
+-- Your servlets and filters in web.xml
+-- DefaultServlet