Ответ 1
Заменить 2 строки...
_ctx.setHandler(rewriter);
_handlerCollection.setHandlers(new Handler[] {_ctx});
с
rewriter.setHandler(_ctx);
_handlerCollection.setHandlers(new Handler[] {rewriter});
Это приведет к тому, что правила перезаписывания начнутся до нормальной обработки контекста.
Подумайте об обработке контекста как о дереве. В вашем примере кода у вас есть....
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