要求しているクライアントのロケールに基づいて、Jetty のサーバー側の URL をリダイレクトしたいと考えています。
すなわち
- クライアントがhost:port/help/index.html を要求します(「help」は webapp war です)
- サーバー側 ' GB ' などのクライアントのロケールを読み取り、*host:port/help_GB/index.html* などの別の Web アプリケーションにリダイレクトします。
これは、Jetty サーバーを実行するサーバー側のコードと同じくらい簡単だと思いました:-
String i18nID = Locale.getDefault().getCountry();
RewriteHandler rewrite = new RewriteHandler();
rewrite.setRewriteRequestURI(true);
rewrite.setRewritePathInfo(false);
rewrite.setOriginalPathAttribute("requestedPath");
RedirectRegexRule r = new RedirectRegexRule();
r.setRegex("/help/(.*)");
r.setReplacement("/help_" + i18nID + "/$1");
rewrite.addRule(r);
server.setHandler(rewrite);
しかし、これは機能しません。すべての「host:port/*」アドレスに対して 404 が返されます。とにかく、ロケールサーバー側を取得していることに気付き、クライアント側が必要なので、独自のハンドラーを作成しました:-
private class MyHandler extends RewriteHandler
{
@Override
public void handle(String target,
Request baseRequest,
HttpServletRequest request,
HttpServletResponse response)
{
try
{
String country = baseRequest.getLocale().getCountry();
String newTarget = target.replace("/help/", "/help_" + country + "/");
if (target.contains("/help/") /*TODO And not GB locale */)
{
response.sendRedirect(newTarget);
}
else
{
super.handle(target, baseRequest, request, response);
}
}
catch(Exception e)
{
/*DEBUG*/System.out.println(e.getClass() + ": " + e.getMessage());
e.printStackTrace();
}
}
}
...そして、RewriteHandler の代わりにそれを使用しました。これは、「/help/」リクエストを受け入れ、リダイレクトせず、一部のページ要素を含まず、ヘルプを含まない他のすべての URI で 404 を返します。
私は何か間違ったことをしているのですか、それとも使用されるべきではない方法で書き換え/リダイレクトハンドラーを使用していますか?!