もしこのブログがお役に立ちましたら、次回のAmazonでのお買い物時に こちらのリンクから 購入していただけますと嬉しく思います。

2011年7月4日

Servlet で 301 リダイレクト

サーバー移行などで URL が変更になった場合、リダイレクトには HTML の meta タグよりも .htaccess が有効だそうです。
ただ、GAE/J など .htaccess が使えない場合はどうするかというと、Servlet に 301 リダイレクトを実装すればいいわけです。

以下の例は元々の URL が
http://www.getore.info/blog/?[ページ番号を指定するクエリ]
だったのが
http://blog.getore.info/[自動生成のリンク]
に変更になった場合です。

public class RedirectServlet extends HttpServlet {
public void service(HttpServletRequest req, HttpServletResponse resp)
throws IOException {
// 変換規則が無い場合は一つ一つマッピングするしかない
Map<String, String> map = new HashMap<String, String>();
map.put("p=404", "2011/06/radiko_714.html");
map.put("p=19", "2009/10/umssort_12.html");

String query = "";
if (req.getQueryString() != null) {
query = req.getQueryString();
}

String file = "";
if (map.containsKey(query)) {
file = map.get(query);
}

// 該当するページが無い場合はトップページに飛ぶ
String url = "http://blog.getore.info/" + file;

resp.setStatus(301);
resp.setHeader("Location", url);
resp.setHeader("Connection", "close");
}
}

何かの変換規則がある場合は、Map を使うのではなく、正規表現などで対応した方が手っ取り早いと思います。

そして、web.xml に上のサーブレットを追加します。
<servlet>
<servlet-name>Redirect</servlet-name>
<servlet-class>info.getore.RedirectServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>Redirect</servlet-name>
<url-pattern>/blog/</url-pattern>
</servlet-mapping>

0 件のコメント:

コメントを投稿